indexOf,lastIndexOf,find,findIndex,every,some,forEach,map,filter,reduce,reduceRight ...
啥子是迭代?可以簡單地理解為按順序訪問目標(數組、對象等)中的每一項(其實和遍歷概念沒什麼差別)
數組的迭代被我分為兩種:
- 查找
- 遍歷
查找:
1.indexOf(item,start)
該方法搜索指定元素值位置,並返回下標。
參數:item是要查找的值,start是指你要從哪裡開始找(該參數可選)。ps:start是可以取負值的,舉個慄子indexOf(x,-5)表示從倒數第6個開始(因為倒數第一個是0嘛),一直找到正序的第0個
如果多次出現,則返回第一次出現的下標(其實找到了就不會接著往後找了);如果沒出現,返回-1。
var fruits = ["Apple", "Orange", "Apple", "Mango"]; var a = fruits.indexOf("Apple"); console.log(a);//0
2.lastIndexOf(item,start) 與上面方法用法一樣,不同的地方是,他是逆行,是從結尾開始找的。start也能指定負值,如果start取-5,則表明從下標為5的地方開始,一直往前找。
var fruits = ["Apple", "Orange", "Apple", "Mango"]; var a = fruits.lastIndexOf("Apple"); console.log(a);//2
3.find() 方法返回通過測試函數的第一個數組元素的值。
參數:(項目值,項目索引,數組本身)
var numbers = [4, 9, 16, 25, 29]; var first = numbers.find(myFunction); function myFunction(value, index, array) { return value > 18; }
4.findIndex() 方法返回通過測試函數的第一個數組元素的索引。
參數:(項目值,項目索引,數組本身)
var numbers = [4, 9, 16, 25, 29]; var first = numbers.findIndex(myFunction); function myFunction(value, index, array) { return value > 18; }
上面的幾個方法沒什麼好講的,接下來才是重點。
遍歷:這類方法有7個
1.some()
2.every()
兩者的函數都接受三個值(項目值,項目索引,數組本身)
這兩個方法都是依次對數組的每項進行判斷,返回boolean類型的值。不同的是,some是只要有一項滿足條件就返回true,而every要求所有項都滿足條件才會返回true。
舉個慄子:
var a=[1,2,3,4,5,4,3,2,1];
var everyResult=a.every(function(item,index,a){ return (item>2); }); var someResult=a.some(function(item,index,a){ return (item>2); });
alert("everyResult:"+everyResult);//false
alert("someResult:"+someResult);//true
當然,也可以也成箭頭函數的形式:
a.some((item)=>{return item>2})
這兩個方法只做判斷,都不會對數組進行改變。
3.forEach()
4.filter()
5.map()
為什麼這三個一起講,因為他們像,與前面some,every一起常作為面試題考。
三者的函數都接受三個值(項目值,項目索引,數組本身)
forEach:其就和for迴圈異曲同工,迴圈遍歷,對每項進行操作。
map:和forEach非常相似,其返回的是 每次函數調用後的結果所組成的數組。
filter:與上面兩者相似,但是其返回的是 函數調用結果值為true的項 (將調用的函數理解成表達式,即返回符合這個表達式所有項組成的新數組)
區別:
map和foreach其實用法上沒啥子區別,但是!還是有點差別的,foreach是沒有返回值的。
然後,filter顧名思義,過濾器,是過濾掉數組不符合條件的項。所以用途上,filter會有很大的不同,常用於篩選掉不要的數組項。
我還是舉慄子吧:
var a=[1,2,3,4,5,4,3,2,1];
var filterResult=a.filter(function(item,index,a){ return (item>2); });
var mapResult=a.map(function(item,index,a){ return item*2; });
var foreachResult=a.forEach(function(item,index,a){
if(item<5) a[index]=0;
});
alert("filterResult:"+filterResult); //3,4,5,4,3
alert("mapResult:"+mapResult); //2,4,6,8,10,8,6,4,2
alert("foreachResult:"+foreachResult); //underfined
alert("foreachResult:"+a); //0,0,0,0,5,0,0,0,0
6.reduce()
7.reduceRight()
參數:
-
- 總數(初始值/先前返回的值)
- 項目值
- 項目索引
- 數組本身
這次我直接舉慄子:
var a=[1,2,3,4,5,4,3,2,1];
var sum=a.reduce(function (prev,cur,index,array){
return prev+cur;
})
alert("sum:"+sum);
上訴用法是最常用的用法,用於對數組所有項進行求和。事實上求積也是可以的,這個方法的靈魂就是有了這個prev值,具體看你如何以應用(不過事實上用的不多,在外部var一個sum變數也可以做到)
ps:reduce()和reduceRight()對於空數組是不會執行回調函數的。
個人愚見,不喜憋著。