for 循环 和 Array 数组对象

javascript/jquery

浏览数:140

2019-5-14

博客地址:https://ainyi.com/12

for 循环 和 Array 数组对象方法

 for for-in for-of forEach效率比较

– 四种循环,遍历长度为 1000000 的数组叠加,得到的时间差:
for 3 for-in 250 for-of 7 forEach 44

– 效率速度:for > for-of > forEach > for-in

– for循环本身比较稳定,是for循环的i是Number类型,开销较小 – for-of 循环的是val,且只能循环数组,不能循环对象 – forEach 不支持 return 和 break,一定会把所有数据遍历完毕 – for-in 需要穷举对象的所有属性,包括自定义的添加的属性也会遍历,for…in的key是String类型,有转换过程,开销比较大  

 1 // 面试: for, forEach, for-in, for-of(es6)
 2 
 3 let arr = [1,2,3,4,5];
 4 arr.b = '100'; // 自定义私有属性
 5 
 6 
 7 
 8 // for循环 速度最快
 9 for (let i = 0; len = arr.length, i < len; i++) { // 编程式
10 console.log("for循环"+arr[i]);
11 }
12 
13 
14 
15 // forEach 不支持return和break,无论如何都会遍历完,
16 arr.forEach(function(item){
17 console.log("forEach循环"+item);
18 });
19 
20 
21 
22 // for-in 遍历的是 key 值,且 key 会变成字符串类型,包括数组的私有属性也会打印输出
23 for(let key in arr){
24 console.log("for in循环"+key);
25 console.log(typeof key);
26 }
27 
28 
29 
30 // for-of 遍历的是值 val,只能遍历数组 (不能遍历对象)
31 for(let val of arr){
32 console.log("for of循环"+val);
33 }
34 
35 
36 // Object.keys 将对象的 key 作为新的数组,这样 for-of 循环的就是原数组的 key 值
37 let obj = {school:'haida',age:20};
38 // 变成 ['school','age']
39 for(let val of Object.keys(obj)){
40 console.log(obj[val]);
41 }

 JavaScript Array 数组对象方法

– 不改变原数组:concat、every、filter、find、includes、indexOf、isArray、join、lastIndexOf、map、reduce、slice、some、toString、valueOf – 改变原数组:pop、push、reverse、shift、sort、splice、unshift  

 重点难点解析

– filter、map、find、includes、some、every、reduce、slice – 数组变异:pop、shift、splice、unshift

  1 // filter 过滤:可用于删除数组元素
  2 // 不改变原数组,过滤后返回新数组
  3 // 回调函数的返回值:若 true:表示这一项放到新数组中
  4 let newArr = [1,2,3,4,5].filter(item => item>2 && item <5);
  5 //数组元素>2且<5的元素返回true,就会放到新数组
  6 console.log("新数组:"+newArr);
  7 
  8 
  9 
 10 
 11 // map 映射,将原有的数组映射成一个新数组 [1,2,3],用于更新数组元素
 12 // 不改变原数组,返回新数组
 13 // 回调函数中返回什么这一项就是什么
 14 // 若要拼接 <li>1</li><li>2</li><li>3</li>
 15 let arr2 = [1,2,3].map(item => `<li>${item}</li>`);
 16 // join方法用于把数组中的所有元素放入一个字符串。每个元素通过指定的分隔符进行分隔。
 17 // 这里使用''空字符分割
 18 console.log(arr2.join(''));
 19 
 20 
 21 // 若只要 name 的 val 值,不要 key 值
 22 let arrJson = [{'name':'krry'},{'name':'lily'},{'name':'xiaoyue'},{'name':'krry'}];
 23 let newArrJson = arrJson.map( val => val.name);
 24 console.log(`newArrJson:${newArrJson}`);
 25 
 26 
 27 
 28 
 29 // find:返回找到的那一项
 30 // 不改变原数组
 31 // 找到后停止循环,找不到返回的是 undefined
 32 let arrFind = [1,2,3,4,55,555];
 33 let result = arrFind.find((item,index) => {
 34 return item.toString().indexOf(5) > -1;// 找数组元素中有5的第一项
 35 });
 36 console.log(result); // 输出 55
 37 
 38 
 39 
 40 
 41 // includes 数组中是否包含某个元素,返回 true or false
 42 let arr3 = [1,2,3,4,55,555];
 43 console.log(arr3.includes(5));
 44 
 45 
 46 
 47 
 48 // some:如果有一个元素满足条件,则表达式返回 true, 剩余的元素不会再执行检测。
 49 // 如果没有满足条件的元素,则返回 false
 50 let arrSF = [1,2,3,4,555];
 51 let result = arrSF.some((item,index)=>{
 52 return item > 3;
 53 });
 54 console.log(result); // 输出true
 55 
 56 
 57 
 58 
 59 // every:如果有一个元素不满足,则表达式返回 false,剩余的元素不会再进行检测。
 60 // 如果所有元素都满足条件,则返回 true
 61 let arrSE = [1,2,3,4,555];
 62 let result = arrSE.every((item,index)=>{
 63 return item > 3;
 64 });
 65 console.log(result); // 输出 false
 66 
 67 
 68 
 69 
 70 // reduce 收敛函数, 4个参数 返回的是叠加后的结果
 71 // 不改变原数组
 72 // 回调函数返回的结果:
 73 // prev:数组的第一项,next是数组的第二项(下一项)
 74 // 当前 return 的值是下一次的 prev
 75 let sum = [1,2,3,4,5].reduce((prev,next,index,item)=>{
 76 // console.log(arguments);
 77 // 1 2
 78 // 3 3
 79 // 6 4
 80 // 10 5
 81 console.log(prev,next);
 82 return prev+next; // 返回值会作为下一次的 prev
 83 });
 84 console.log(sum);
 85 
 86 
 87 // reduce 可以默认指定第一轮的 prev,那么 next 将会是数组第一项(下一项)
 88 // 例子:算出总金额:
 89 let sum2 = [{price:30,count:2},{price:30,count:3},{price:30,count:4}];
 90 let allSum = sum2.reduce((prev,next)=>{
 91 // 0+60
 92 // 60+90
 93 // 150+120
 94 console.log(prev,next);
 95 return prev+next.price*next.count;
 96 },0); // 默认指定第一次的 prev 为 0
 97 console.log(allSum);
 98 
 99 
100 // 利用reduce把二维数组变成一维数组
101 let flat = [[1,2,3],[4,5,6],[7,8,9]].reduce((prev,next)=>{
102 return prev.concat(next); // 拼接数组
103 });
104 console.log(flat);
105 
106 
107 
108 
109 // slice 从已有的数组中返回选定的元素
110 // 不改变原数组
111 let fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
112 let citrus = fruits.slice(1,3);
113 console.log(citrus); // 输出 Orange,Lemon
114 
115 
116 
117 
118 // pop 用于删除数组的最后一个元素并返回删除的元素
119 // 改变原数组
120 let fur = ["Banana", "Orange", "Apple", "Mango"];
121 fur.pop();
122 console.log(fur); // 输出 Banana,Orange,Apple
123 
124 
125 
126 
127 // shift 用于把数组的第一个元素从其中删除,并返回第一个元素的值
128 // 改变原数组
129 let fts = ["Banana", "Orange", "Apple", "Mango"];
130 fts.shift();
131 console.log(fts);// 输出 Orange,Apple,Mango
132 
133 
134 
135 
136 // unshift 向数组的开头添加一个或更多元素,并返回新的长度
137 // 改变原数组
138 let fse = ["Banana", "Orange", "Apple", "Mango"];
139 fse.unshift("Lemon","Pineapple");
140 console.log(fse); // 输出 Lemon,Pineapple,Banana,Orange,Apple,Mango
141 
142 
143 
144 
145 // splice 用于插入、删除或替换数组的元素
146 // 改变原数组
147 let myArrs = ["Banana", "Orange", "Apple", "Mango"];
148 myArrs.splice(2,1); // 从数组下标为 2 开始删除,删除 1 个元素
149 console.log(myArrs); // 输出 Banana,Orange,Mango

 额外谈一下arguments

 1 // arguments 是一个对应于传递给函数的参数的类数组对象
 2 // 此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。
 3 // 例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
 4 // arguments[0]
 5 // arguments[1]
 6 // arguments[2]
 7 let xx = sumAll(1, 123, 500, 115, 44, 88);
 8  
 9 function sumAll() {
10 let i, sum = 0;
11 for (i = 0; i < arguments.length; i++) {
12 sum += arguments[i];
13 }
14 console.log(sum); // 返回总和 871
15 }

 for 效率测试代码

 1 let arr = new Array();
 2 for(let i = 0, len = 1000000;i < len; i++){
 3 arr.push(i);
 4 }
 5  
 6 function foradd(my_arr){
 7 let sum = 0;
 8 for(let i = 0; i < my_arr.length; i++){
 9 sum += my_arr[i];
10 }
11 }
12  
13 function forinadd(my_arr){
14 let sum = 0;
15 for(let key in my_arr){
16 sum += my_arr[key];
17 }
18 }
19  
20 function forofadd(my_arr){
21 let sum = 0;
22 for(let val of my_arr){
23 sum += val;
24 }
25 }
26 
27 
28 function forEachadd(my_arr){
29 let sum = 0;
30 my_arr.forEach(val => {
31 sum += val;
32 });
33 }
34  
35 function timeTest(func,my_arr,str) {
36 var start_time = null;
37 var end_time = null;
38 start_time = new Date().getTime();
39 func(my_arr);
40 end_time = new Date().getTime();
41 console.log(str,(end_time - start_time).toString());
42 }
43  
44 timeTest(foradd,arr,'for');
45 timeTest(forinadd,arr,'for-in');
46 timeTest(forofadd,arr,'for-of');
47 timeTest(forEachadd,arr,'forEach');

博客地址:https://ainyi.com/12

作者:筱月