ES6語法學習筆記之陣列的各種迴圈方法

梭梭醬加油鴨發表於2019-01-30

一、回顧ES5中的一些迴圈方法

1.forEach()

		let arr = ['apple','orange','tomato','banana'];

		arr.forEach(function(val,index,arr){
			console.log(val,index,arr);
		});//依次列印的是該陣列每次迴圈的值,索引號和陣列本身,這是es5裡原本擁有的一個迴圈
複製程式碼

forEach()通常有兩個引數,第一個就是每迴圈一次需要執行的回撥函式,該函式有三個引數,分別是每次迴圈的選項,索引和陣列本身;第二個則是當前this指向的物件,預設是window,還可以指定為任意字串、數字、document等等。

		arr.forEach((val,index,arr)=>{
			console.log(val,index,arr);
		});//如上也可以換成箭頭函式表達
複製程式碼

但是,當回撥函式用箭頭函式表達時,第二個引數無論怎麼寫,this物件都是當前函式定義所在的物件,一般情況下是window。但如果當前函式被定義在某個json物件裡,那就是該json物件。

2.map()非常有用,做資料互動對映

如下案例,map看起來與forEach的作用一致

		let arr1=[
		{title:'aaaaa',read:'120',hot:true},
		{title:'bbbbb',read:'100',hot:true},
		{title:'ccccc',read:'15',hot:true},
		{title:'ddddd',read:'10',hot:true},
		{title:'eeeee',read:'195',hot:true},
		];

		arr1.map((item,index,arr)=>{
			console.log(item,index,arr);
		});//依次列印陣列的每個選項、索引及陣列本身
複製程式碼

map正常情況下,需要結合return使用,返回一個新陣列;如果沒有return,就相當於forEach。

如下案例中,如果加了return,則返回陣列[1,1,1,1,1];如果沒加,則返回陣列[undefined,undefined,undefined,undefined,undefined]。

		let newArr = arr1.map((item,index,arr)=>{
			console.log(item,index,arr);
			return 1;
		});

		console.log(newArr);//arr1在上個案例中定義
複製程式碼

注意:map會返回一個陣列,forEach則沒有返回值,上面的map如果改成forEach返回的結果只有一個undefined.

map還可以用於整理資料的表達方式:

		let arr2=[
		{title:'aaaaa',read:120,hot:true},
		{title:'bbbbb',read:100,hot:true},
		{title:'ccccc',read:15,hot:true},
		{title:'ddddd',read:10,hot:true},
		{title:'eeeee',read:195,hot:true},
		];


		//map還可以用於整理資料的表達方式

		let newArr2 = arr2.map((item,index,arr2)=>{
			let json2={}
			json2.t=`哈哈哈${item.title}-----`;
			json2.r=item.read+200;
			json2.hot=item.hot==true && '牛逼!';
			return json2;
		});
		
		console.log(newArr2);
		/*
		[
		0: {t: "哈哈哈aaaaa-----", r: 320, hot: "牛逼!"}
                1: {t: "哈哈哈bbbbb-----", r: 300, hot: "牛逼!"}
                2: {t: "哈哈哈ccccc-----", r: 215, hot: "牛逼!"}
                3: {t: "哈哈哈ddddd-----", r: 210, hot: "牛逼!"}
                4: {t: "哈哈哈eeeee-----", r: 395, hot: "牛逼!"}
                length: 5
                __proto__: Array(0)
                ]
        */
複製程式碼

filter(),過濾一些不合格的“元素”,如果返回值為true,那麼它的值就留下來

		let arr3=[
		{title:'aaaaa',read:120,hot:true},
		{title:'bbbbb',read:100,hot:false},
		{title:'ccccc',read:15,hot:true},
		{title:'ddddd',read:10,hot:true},
		{title:'eeeee',read:195,hot:false},
		];

		let newArr3 = arr3.filter((item,index,arr3)=>{
			// return item.hot==true;
			return item.hot;
		});

		console.log(newArr3);//只有hot為true的被返回
複製程式碼

some()類似於查詢,陣列裡面只要有某一個元素符合條件,就返回true

		let arr4=['apple','banana','orange'];
		let arrr4 = arr4.some((val,index,arr4)=>{
			return val=='banana';
		});
		console.log(arrr4);//true
複製程式碼
		let arr5=['apple','banana','orange'];
		
		function findInArray(arr,item){
			return arr.some((val,index,arr)=>{
				return val==item;
			});
		}
		console.log(findInArray(arr5,'orange'));
複製程式碼

every()陣列必須都符合條件,才返回true

		let arr6 = [1,3,5,7,9];
		var arrr6 = arr6.every((val,index,arr6)=>{
			return val%2==1;
		});

		console.log(arrr6);//true
複製程式碼

reduce()回撥函式接受4個引數,第一個是上一個值,第二個是當前值,第三個索引,第四個當前陣列

偶爾會被用來求和:

		let arr7=[1,2,3,4,5,6,7,8,9,10];
		let res = arr7.reduce((prev,cur,index,arr)=>{
			return prev+cur;
		});

		console.log(res);//55,即陣列的和
複製程式碼
		let arr8=[2,2,3];
		let res2 = arr8.reduce((prev,cur,index,arr)=>{
			return Math.pow(prev,cur);//math.pow(x,y),求x的y次方
		});

		console.log(res2);//64
複製程式碼

ruduceRight()和上面相似,但計算順序是從右往左:

		let arr9=[2,2,3];
		let res3 = arr9.reduceRight((prev,cur,index,arr)=>{
			return Math.pow(prev,cur);
			//return prev**cur;
		});

		console.log(res3);//3的2次方是9,9的2次方是81,結果81
複製程式碼

ES6新增的迴圈

for...of...

arr.keys()表示陣列的下標,arr.entries()表示陣列的每一項,其本身也可認為是一個陣列,所以item[0]才是索引

		let arr=['apple','banana','orange','tomato'];
		for (let val of arr){
			console.log(val);
		};//列印陣列的值

		for(let index of arr.keys()){
			console.log(index);
		};//列印陣列的索引

		for (let item of arr.entries()){
			console.log(item);
			console.log(item[0]);//列印索引
			console.log(item[1]);//列印值
		};//同時列印索引和值
		
		for(let [key,val] of arr.entries()){
			console.log(key,val);
		};
複製程式碼

相關文章