多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
``` var data=[{'name':'dash','age':20},{'name':'tom','age':20}] //遍历数组 data.forEach(function(e, i){//异步的 同步用for in //console.log(i) console.log(e) //遍历对象 Object.keys(e).forEach(function(key){ console.log(e[key]) }) }) ``` ## 数组循环的方法 1.forEach() ``` let array = [1,2,3,4]; array.forEach((item, index, array) => {   console.log(item); }); //参数:value数组中的当前项, index当前项的索引, array原始数组; //数组中有几项,那么传递进去的匿名回调函数就需要执行几次; ``` forEach会遍历数组, 没有返回值, 不允许在循环体内写return, 不会改变原来数组的内容.forEach()也可以循环对象。不支持IE 2.map() ``` let array = [1, 2, 3, 4]; let temp = array.map((item, index, array) => {   return item * 10; }); console.log(temp);  // [10, 20, 30, 40]; console.log(array);  // [1, 2, 3, 4] //支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了) ``` map 遍历数组, 会返回一个新数组, 不会改变原来数组里的内容 ``` let temp2 = array.map(String);  // 把数组里的元素都转成字符串 console.log(temp2); ``` 3.filter() ``` let array = [1, 2, 3, 4]; let temp = array.filter((item, index, array) => {   return item > 3; }); console.log(temp);  // [4] console.log(array);  // [1, 2, 3, 4] ``` filter 会过滤掉数组中不满足条件的元素, 把满足条件的元素放到一个新数组中, 不改变原数组 4.reduce() ``` let array = [1, 2, 3, 4]; let temp = array.reduce((x, y) => { console.log("x,"+x); console.log("y,"+y); console.log("x+y,",Number(x)+Number(y)); return x + y; }); console.log(temp);  // 10 console.log(array);  // [1, 2, 3, 4] ``` x 是上一次计算过的值, 第一次循环的时候是数组中的第1个元素 y 是数组中的每个元素, 第一次循环的时候是数组的第2个元素 5.every() ``` let array = [1, 2, 3, 4]; let bo = array.every((item, index, array) => {   return item > 2; }); console.log(bo);    // false; ``` every遍历数组, 每一项都是true, 则返回true, 只要有一个是false, 就返回false 6.some() ``` let array = [1, 2, 3, 4]; let temp = array.some((item, index, array) => {   return item > 5; }); console.log(temp);  // false ``` 遍历数组的每一项, 有一个返回true, 就停止循环 以上6个方法IE9及以上才支持。不过可以通过babel转义支持IE低版本。 以上均不改变原数组。 some、every返回true、false。 map、filter返回一个新数组。 reduce让数组的前后两项进行某种计算,返回最终操作的结果。 forEach 无返回值。 **for循环** 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。 ``` for(j = 0,len=arr.length; j < len; j++) { } ``` **forr...of遍历** 可以正确响应break、continue和return语句 ``` for (var value of myArray) { console.log(value); } ``` **for...in循环** 存储的索引的数据类型是字符串类型 如果要执行加法运算,需要转化为数值类型 ~~~ var arr = ['北京','上海','广州','重庆','天津']; for(var key in arr){ // 自定义变量,存储索引 0 1 2 3 4 .... console.log(key,arr[key]); // arr[key] 就是索引对应的数据 } ~~~ for 和 for/in 语句都可以迭代数组。for 语句需要配合 length 属性和数组下标来实现,执行效率没有 for/in 语句高。 对于超长数组来说,建议使用 for/in 语句进行迭代 另外,for/in 语句会跳过空元素。 ``` var b = [], num = 0; for (var i in a) { //遍历数组 if(typeof a[i] == "number") //如果为数字,则返回该元素的值 b.push(a[i]); num ++; //计数器 } console.log(num); //返回7,说明循环了7次 console.log(b); //返回[1,2,4,56] ``` ## 对象的遍历 ### **for 遍历对象的办法** ``` var data={'name':'tom','age':19} //对象键组成的数组 var keys = Object.keys(data);// 对象值组成的数组 :Object.values(data) for (var j = 0; j < keys.length; j++) { var v=data['data'][i][keys[j]]; } ``` ### Object.keys(data).forEach(function(key){} ~~~ var obj = {'0':'a','1':'b','2':'c'}; Object.keys(obj).forEach(function(key){ console.log(key,obj[key]); }); ~~~ ### Object.getOwnPropertyNames(obj) 使用Object.getOwnPropertyNames(obj) ~~~ 返回一个数组,包含对象自身的所有属性(包含不可枚举属性) 遍历可以获取key和value const obj = { id:1, name:'zhangsan', age:18 } Object.getOwnPropertyNames(obj).forEach(function(key){ console.log(key+ '---'+obj[key]) }) ~~~ ### for......in