先说结论
对象key > 数组循环 indexOf
插入小知识(可不看)
数组数据处理、为了快速查找数据,避免使用indexOf,一般我会转为对象。
要找数据直接在obj
用key去找,避免for
循环内使用indexOf()
造成双循环。
let obj = arr.reduce((obj, item) => {
obj[item.name] = item
return obj
}, {})
接下来会使用时间戳进行对比,输出的单位为 ms
对比
先准备数据
// 测试数据
let tempArr = new Array(9999999).fill(1).map((i, index) => {
return { name: index, index }
})
// 相同数据对象形
let tempObj = tempArr.reduce((obj, item) => {
obj[item.name] = item
return obj
}, {})
// 准备需要查找的下标id
let testRandom = [245, 789, 456, 12324, 456781234567890]
再写测试代码
let timer = null // 计时开始
// 一个一个循环找
let array = () => {
timer = new Date().getTime()
let a = tempArr.reduce((list, item) => {
if (testRandom.includes(item.index)) { // 数据中查找
list.push(item)
}
return list
}, [])
console.log('array:', new Date().getTime() - timer)
}
// 通过key直接查找
let objKey = () => {
timer = new Date().getTime()
let a = testRandom.reduce((list, key) => {
if (tempObj[key]) list.push(tempObj[key]) // key直接判断
return list
}, [])
console.log('objKey:', new Date().getTime() - timer)
}
array()
objKey()
/*
输出
array: 188
objKey: 0
*/
拓展
既然有对象,当然不能忽视Object.keys()
和Object.values()
方法
我们再来一轮用对象转数组的查找
先说结论:Object.keys()
方法消耗的时间非常的恐怖
下面分别用两种方式做计时
// 对象转key Object.keys()
let objectByKeys = () => {
timer = new Date().getTime()
let tempObjKye = []
tempObjKye = Object.keys(tempObj)
// for (let key in tempObj) {
// tempObjKye.push(key)
// }
/// for取key 和 Object.keys() 所用时间相似 ///
console.log('objectByKeys:转换时间:', new Date().getTime() - timer)
let a = tempObjKye.reduce((list, key) => {
if (testRandom.includes(key)) {
list.push(key)
}
return list
}, [])
console.log('objectByKeys:', new Date().getTime() - timer)
}
// 对象转数组方法 Object.values()
let objectByValues = () => {
timer = new Date().getTime()
let a = Object.values(tempObj).reduce((list, item) => {
if (testRandom.includes(item.index)) {
list.push(item)
}
return list
}, [])
console.log('objectByValues:', new Date().getTime() - timer)
}
objectByKeys()
objectByValues()
/*
输出
objectByKeys:转换时间: 8966
objectByKeys: 9172
objectByValues: 228
*/