Array - 遍歷方式

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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容