js 如何高效的找到数组中的某一项

比如说一个数组:

let arr = [
    {id: 1, name: 'a'},
    {id: 2, name: 'b'},
    {id: 3, name: 'c'},
    ...
]

如果不考虑有重复项的话,如何快速的找到指定id的那一项,并移除?

想知道比较高效的方法有哪些,谢谢!

阅读 13.6k
7 个回答

const arr2 = arr.filter(item=>item.id!==2);
clipboard.png

let arr = [
  {id: 1, name: 'a'},
  {id: 2, name: 'b'},
  {id: 3, name: 'c'},
]

let arr2 = arr.filter(item => item.id !== 1)

现有的数据看起来,arr[i-1]id就等于i,所以直接删除arr[i-1]应该就可以了,数据在多了可以考虑二分查找,或者把arr转换成一个object,属性名为id的值,属性值为name的值,就像是

arr2 = {"1": "1", "2": "b", ...}

把id的值当做key映射到一个对象上,然后留可以用obj[id]这种形式访问了

没有重复的话,把索引数组转成关联数组,用下标去找应该能很快。
如果有重复的话,那就利用闭包写一个带记忆功能的查找函数,应该可以提高速度。

我试了下这个方法,

arr.splice(arr.findIndex((item) => {return item.id == 10}), 1);

为啥我测耗时 结果却是这样....
图片描述

写法很多种 比如 说找到 id=2这步
entries(),keys()和values()遍历
arr.find((n) => n.id == 2)
arr.findIndex()
至于删除这一步,其实要从第一步实现的策略上来看,比如我第一步是获取索引,那还是要有删除这一步,或者第一步我是建立新数组,把id!=2的 获取出来。
当然还有别的思路,比如改变存储结构 假设id 不重复 数组成 map形式的,key是 id 这样做的好处优点也是显而易见的,
至于说那种方法好,很难说,需要从 时间 空间,业务具体需要 来看。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题