数组常用迭代方法

168 阅读2分钟

1.数组常用的迭代方法

  • for 迭代素组最快的方法,不能接受返回值
  • for of 可以迭代任何可迭代的,数组只可迭代的其中一种,不能接受返回值
  • map 接受参数(value, index, array),项目值、索引、和项目本身 可以接受返回值
  • forEach 接受参数(value, index, array),项目值、索引、和项目本身 不能接受返回值
  • filter 接受参数(value, index, array),项目值、索引、和项目本身,返回符合条件的元素
  • reduce 接受参数(total, value, index, array),每次循环的返回值,项目值、索引、和项目本身,可以接受返回值,返回值是total
  • every 接受参数(value, index, array),项目值、索引、和项目本身,返回值是布尔值,&&的意思
  • some 接受参数(value, index, array),项目值、索引、和项目本身,返回值是布尔值,||的意思

这么多方法哪个快呢??

测试条件:循环一个10万长度的素组看看速度

//数组迭代方法

let arr = [...new Array(10000000).keys()]
// for
let date1 = new Date()
for (let i = 0; i < arr.length; i++) {
  arr[i] * 2
}
console.log(`for循环需要的时间:${new Date() - date1}`);
// for of
let date2 = new Date()
for (let k of arr) {
  k * 2
}
console.log(`for of 循环需要的时间:${new Date() - date2}`);

// forEach
let date3 = new Date()
arr.forEach(item => {
  item * 2
})
console.log(`forEach 循环需要的时间:${new Date() - date3}`);

// map 
let date4 = new Date()
arr.map(item => {
  item * 2
})
console.log(`map 循环需要的时间:${new Date() - date4}`);

// filter
let date5 = new Date()
arr.filter(item => {
  item * 2
})
console.log(`filter 循环需要的时间:${new Date() - date5}`);
let arr2 = [...new Array(10).keys()]
// reduce
let date6 = new Date()
arr.reduce((val, item) => {
  item * 2
})
console.log(`reduce 循环需要的时间:${new Date() - date6}`);
// every
let date7 = new Date()
arr.every((item) => {
  item * 2
})
console.log(`every 循环需要的时间:${new Date() - date7}`);

// some
let date8 = new Date()
arr.some((item) => {
  item * 2
})
console.log(`some 循环需要的时间:${new Date() - date8}`);

结果: for 最快,forEach要比map快很多,经常用map的小伙伴注意了,当然它们每个方法都有自己的特点,根据场景选择方法。

这些方法会不会改变原来的数组的值呢???

这里我直接写结论,, 对于数组里面的基本元素,以上方法都不会改变,但是对于数组里面的引用类型数据会改变,因为这些方法都是将素组元素浅拷贝传给你调用的

let arr1 = [{}, {}]
arr1.forEach(item => {
  item.name = "forEach"
});
console.log(arr1)
arr1.map(item => {
  item.name = "map"
})
console.log(arr1)
for (let i of arr1) {
  i.name = "of"
}
console.log(arr1)
arr1.filter(item => {
  item.name = "filter"
})
console.log(arr1)
arr1.reduce((t, item) => {
  item.name = "reduce"
})
console.log(arr1)
arr1.some(item => {
  item.name = "some"
})
console.log(arr1)
arr1.every(item => {
  item.name = "every"
})
console.log(arr1)

结果如下: 可以看到都会改变.