數組遍歷、過濾、迭代的方法

前端數據操作過程中,少不免要對數組進行處理。那數組裏面提供的方法常用到的簡單的做個整理,主要是數組的過濾、遍歷和迭代。

  • 遍歷:按一定順序查看數組裏面的每一個元素值,可以處理得到相應的值或者得到最終值。
  • 過濾:將滿足條件的元素篩選出來,返回數組filter。
  • 迭代:指依次計算元素,元素前後相互影響計算值,最後返回一個結果值。

1.遍歷

for循環:遍歷數組最常用的方法,適用於數組已知,知道其具體值、具體長度的情況。

var arr = [1,2,3,4,5,6,7,8]
for(var a=0;a<arr.length;a++){
//	console.log(typeof a) //number//索引是數字類型,藍色字體   
	console.log(a+""+arr[a])
}

for in:遍歷的是數組的屬性名稱,可以用來遍歷對象。一個數組實際上也是一個對象,它的每個元素的索引被視爲一個屬性。

var arr = [1,2,3,4,5,6,7,8]
for(var i in arr){
//	console.log(typeof i) //string//索引是字符串類型
	console.log(i+arr[i])
}

arr.value = "val";
for(var i in arr){
	console.log(i+'   '+arr[i])
}
console.log(arr) //[1,2,3,4,5,6,7,8,value:'val']
alert(arr)		//1,2,3,4,5,6,7,8

for和for in的區別:

  • for循環需要知道數組的長度,循環的是一個已知的數組;而for in可以循環未知的數組,並不需要知道其長度;
  • for in遍歷的是數組的屬性名稱,可以用來遍歷對象;而for遍歷的是數組的每一項,遍歷的是個值,不能用來遍歷對象;
  • for in可以遍歷到數組添加的自定義屬性,而for不能;
  • for和for in的索引值類型不同:for索引是number類型,而for in索引是string類型。

forEach:這個方法是有ES5提供的

var arr = [1,2,3,4,5,6,7,8]
arr.value = "val";
arr.forEach(function(item,index){
	console.log(""+index+item)
})

var arr1 = [1,2,3,4,,5,6,7,8]
arr1.forEach(function(item,index){
	console.log(""+index+item)
})

對於forEach,未賦值的值是不會在foreach循環迭代的,但是手動賦值爲undefined的元素是會被列出的,01 12 23 34 55 66 77 88

如果是空“”,則結果是01 12 23 34 4 55 66 77 88,位置還是在的。foreach是數組的方法,不能用來遍歷對象。添加自定義屬性無效,不會遍歷到。

for of:該方法是有ES6提供的

var arr = [1,2,3,4,5,6,7,8]
var arr1 = [1,2,3,,5,6,7,8]
var obj = {one:1,two:2,three:3}
arr.value = "val";

for(var value of arr){
	console.log(value)
}

for(var value of arr1){
	console.log(value)
}

forEach和for of比較

  • 不同點:
  1. 提出的時間不同,for each是ES5提出,for of是ES6提出;
  2. for of遍歷得到的是數組的項,沒得到數組的索引;
  3. 未賦值的值(數組項的位置上什麼都沒有),forEach得到的是空不展示,二for of得到的是undefined。
  • 相同點:
  1. 都是數組的方法,不能用來遍歷對象;
  2. 自定義屬性不能遍歷到;
  3. 不能用來遍歷屬性名。

for in和for of比較,區別(此處參考另一篇博文):

  • 循環對象屬性用for in,遍歷數組用for of
  • for in循環出來的是key,for of循環出來的是value
  • for in 是ES5標準,for of 是ES6標準,兼容可能存在問題慎用
  • for of不能遍歷普通的對象,需要和和Object.keys()搭配使用
  • for...in 循環除了遍歷數組元素外,還會遍歷自定義屬性,for...of只可以循環可迭代的可迭代屬性,不可迭代屬性在循環中被忽略了。

map:遍歷數組,得到的結果還是一個數組。可以通過callback對數組元素進行操作,將操作結果放入數組中並返回該數組。

var arr = [1,2,3,4,,5,6,7,8]
var a = arr.map(function(item,i,array){
	return item+''+i
})
console.log(a)

注:map是數組的方法,不用來遍歷對象,未賦值的值也不會迭代,只是位置存在,如上面代碼顯示結果:Array(9)展示就是

[0:"10",1:"21",2:"32",3:"43",5:"55",6:"66",7:"77",8:"88"]。遍歷的也是數組的項而不是屬性名。

every:當數組中的每一個元素在callback上被返回true時就返回true

var arr2 = ["hello",1,2,3,4,5]
var bol = arr2.every(function(item,i,array){
	if(typeof item == "string"){
		return item;
	}
})
console.log(bol) //false

some:當數組中的某一元素在callback上被返回true時返回true

var arr2 = ["hello",1,2,3,4,5]
var bol1 = arr2.some(function(item,i,array){
if(typeof item == "string"){
	return item;
}
})
console.log(bol1)

every()與some()對比

區別是:前者要求所有元素都符合條件才返回true,後者要求只要有符合條件的就返回true

相同點:對數組中元素每一項進行布爾運算,返回false和true。

2.過濾

filter:返回一個包含所有在回調函數上返回爲true的元素新數組,回調函數在此擔任的是過濾器的角色。

var arr = [1,2,3,4,,5,6,7,8]
var obj = {one:1,two:2,three:3}
arr.value = "val";
var b = arr.filter(function(item,i,array){
	if(typeof item == "number"){
		return item+""+i+""+array;
	}
})
console.log(b)

注:1、filter不支持索引,回調不支持第二個參數;

       2、當元素符和條件,過濾器就返回true,而filter則會返回所有符合過濾條件的元素;

       3、屬性名無效,不支持對象遍歷的方法。

every()與filter()的區別:

  • 後者會返回所有符合過濾條件的元素;
  • 前者會判斷是不是數組中的所有元素都符合條件,並且返回的是布爾值

3.迭代

reduce:從前向後迭代。迭代從第二項開始,prev初始值爲第一項,cur初始值爲第二項。計算值自動傳給下一函數的prev,返回最後一次迭代產生的值。結果是1+2+3+4+5+6+7+8,如果是prev+cur,結果會是36。

var arr = [1,2,3,4,,5,6,7,8]
var ccc = arr.reduce(function(prev,cur,index,arry){
	return prev+"+"+cur
})
console.log(ccc)

reduceRight:從後向前迭代。迭代從倒數第二項開始,prev初始值爲最後一項,cur初始值爲倒數第二項。計算值自動傳給下一函數的prev,返回最後一次迭代產生的值。結果是8+7+6+5+4+3+2+1,如果是prev+cur結果是36。

var arr = [1,2,3,4,,5,6,7,8]
var ccc = arr.reduceRight(function(prev,cur,index,arry){
	return prev+"+"+cur
})
console.log(ccc)

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章