1. for
使用臨時(shí)變量,將長(zhǎng)度緩存起來(lái),避免重復(fù)獲取數(shù)組長(zhǎng)度,當(dāng)數(shù)組較大時(shí)優(yōu)化效果才會(huì)比較明顯。
代碼塊當(dāng)中寫(xiě)入return會(huì)報(bào)錯(cuò)。
// 求和
let arr = [2, 3, 4, 5],
numbers = 0;
for(let i = 0, len = arr.length; i < len; i++){
numbers += arr[i]
}
console.log(numbers);
// 數(shù)組去重
let arr = [2, 3, 5, 6, 3, 5],
newArr = [];
for(let i = 0, len = arr.length; i < len; i++){
if(!~newArr.indexOf(arr[i])){
newArr.push(arr[i]);
}
}
console.log(newArr);
2. foreach
沒(méi)有返回值,return無(wú)效,不支持break 和 continue, 遍歷的過(guò)程當(dāng)中索引不變。
let arr = [2, 3, 4, 5];
arr.foreach((curValue, index, self) => {
})
刪除自身
forEach因?yàn)閕ndex索引無(wú)法重置,對(duì)于刪除自身數(shù)組元素比較困難,當(dāng)時(shí)filter是比較好的方案
let arr = [1, 2, 1, 1];
arr.slice().reverse().forEach(function (item, index, arr1) {
if (item === 1) {
arr.splice(arr1.length - 1 - index, 1);
}
});
3. map
有返回值,支持return,不支持break 和 continue,遍歷的過(guò)程當(dāng)中索引不變。
直接return的返回值,會(huì)重新拷貝當(dāng)前數(shù)組,
以新的結(jié)果返回。
arr.map((curValue, index, self) => {
})
// 回調(diào)函數(shù)的傳參和foreach一致
map 和 foreach的區(qū)別
foreach的返回值無(wú)效, 返回undefined,所以只能直接修改本身Array。
map有返回值,而返回值相當(dāng)于拷貝的結(jié)果返回。
4. for of 和 for in
可以正確響應(yīng)break、continue和return語(yǔ)句
// for of
for(var value of arr){
}
for(var key in arr){
}
注意
使用for in 會(huì)遍歷對(duì)象的所有可枚舉屬性,包括原型的方法和屬性
綜上所述, for in 更適合用于遍歷對(duì)象
Array.prototype.methoud = ()=>{
console.log(this.length);
}
var arr = ['a', 'b', 'c'];
for(var key in arr){
console.log(arr[key]);
}
5. filter 過(guò)濾
創(chuàng)建一個(gè)新的數(shù)組,新數(shù)組檢查是否符合條件的所有元素
注意: 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè), 也不會(huì)改變?cè)紨?shù)組
Array.filter((curValue, index, arr) => {
}, thisValue)
數(shù)組去重
let arr = [2, 3, 5, 6, 3, 5],
newArr = arr.filter((cur, index) =>{
return arr.indexOf(cur) === index;
})
console.log(newArr);
條件篩選
let arr = [
{
value: 100,
done: true
},
{
value: 90,
done: false
},
{
value: 60,
done: true
},
{
value: 80,
done: true
}
]
let newArr = arr.filter((cur) =>{
return cur.value >= 80 && cur.done;
})
6. some 和 every
some 函數(shù)對(duì)任一項(xiàng)返回true,相當(dāng)于||,
some一直在找符合條件的值,一旦找到,則不會(huì)繼續(xù)迭代下去。
every 函數(shù)對(duì)每一項(xiàng)都是true,才會(huì)返回true,相當(dāng)于&&,
every從迭代開(kāi)始,一旦有一個(gè)不符合條件,則不會(huì)繼續(xù)迭代下去。
let arr = [2, 3, 4, 5];
let resultSome = arr.some((cur, index, self) =>{
return cur > 4;
})
let resultEvery = arr.every((cur, index, self) = >{
return cur >= 2;
})
7. reduce
返回累計(jì)的結(jié)果
// accumulator 累計(jì)器
Array.reduce(function(accumulator, curValue, index, self){
}, [initValue])
initValue的設(shè)置相當(dāng)于以什么樣的形式第一次進(jìn)入accumulator,
如果不設(shè)置,acc會(huì)相當(dāng)于第一個(gè)元素的值,cur的值會(huì)是第二個(gè)元素,相反設(shè)置的話(huà),acc是設(shè)置后的值,cur是第一個(gè)元素;
而并非索引
求和
let arr = [2, 3, 4, 5];
arr.reduce((acc, cur) => {
return acc + cur;
}, 0)
// 報(bào)錯(cuò),"TypeError: Reduce of empty array with no initial value"
// 數(shù)組求乘
arr.reduce((acc, cur) => {
acc.push(cur * 2);
return acc;
}, [])
如果是空數(shù)組會(huì)報(bào)錯(cuò),因?yàn)閕nitValue沒(méi)有設(shè)置;
如果數(shù)組只有一個(gè)元素,會(huì)被直接返回,而不執(zhí)行回調(diào)方法;
所以一般來(lái)說(shuō)我們提供初始值通常更安全
設(shè)置成對(duì)象
let arr = [2, 3, 4, 5];
arr.reduce((acc, cur) => {
acc.count = acc.count + cur;
return acc;
}, {count: 0})
去重
let arr = [2, 3, 5, 6, 3, 5];
arr.reduce((acc, cur) => {
if(!acc.includes(cur)){
acc.push(cur);
}
return acc;
}, [])
扁平化
let arr = [1, 2, [3, 4], [5, [5, 6]]];
var flatten = arr => {
return arr.reduce((prev, cur) => {
return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
}
flatten(arr);