前端的几种可用于遍历的方式(for, forin,filter,map),哪种效率高呢?
项目场景1:
循环将一个数组中的值赋给另一个数组
测试1:
代码:
//for
t = new Date().getTime()
var result1 = []
for (var i = 0; i < data.length; i++) {
result1.push(data[i])
}
t1 = new Date().getTime()
console.log("for循环用时:",t1 - t)
//map
t2 = new Date().getTime()
var result2 = data.map(v => v)
t3 = new Date().getTime()
console.log("map用时:",t3 - t2)
//filter
t4 = new Date().getTime()
var result3 = data.filter(v => true)
t5 = new Date().getTime()
console.log("filter循环用时:",t5 - t4)
//forin
t6 = new Date().getTime()
for (var i in data) {
// data[i]
}
t7 = new Date().getTime()
console.log("forin循环用时:",t7 - t6)
代码瞎写的,不看也罢,直接看结果:
现在是运行10000000条数据,单位(ms)
for循环用时: 393
map用时: 156
filter循环用时: 282
forin循环用时: 3718
…用时: 18 (写法: data1 = […data])
项目场景2:
将符合条件的数据赋值给另一个数组,假设有一半符合条件的数据
测试2:
//for
tt = new Date().getTime()
var result1 = []
for (var i = 0; i < data.length; i++) {
if(data[i] > data.length / 2){
result1.push(data[i])
}
}
tt1 = new Date().getTime()
console.log("for循环用时:",tt1 - tt)
//filter
t4 = new Date().getTime()
var result3 = data.filter(v => v.id > data.length / 2)
t5 = new Date().getTime()
console.log("filter循环用时:",t5 - t4)
//forin
var result4 = []
t6 = new Date().getTime()
for (var i in data) {
if(i > data.length / 2){
result4.push(data[i])
}
}
t7 = new Date().getTime()
console.log("forin循环用时:",t7 - t6)
运行结果:
for循环用时: 1086
filter循环用时: 327
forin循环用时: 4254
总结:
filter,map方法效率还是很高的,可能少量数据(10w一下)可能用时不如for循环,但是写法简单,可读性高,那十几毫秒的时差构不成威胁。尤其是在大量数据情况下,依旧可以高效运行。
forin的测试结果让我有点懵,竟然可以这么慢。但是不可否认的是它在遍历对象时还是挺方便的。