js数组对象查找数据性能对比

先说结论

对象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
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值