如何根据指定字段值集合查找对象数组中对应元素的索引?
解决数组匹配索引的问题
嘿,我来帮你搞定这个问题~先理清楚我们的需求:
- 有一个字符串数组
element,里面是我们要找的目标值 - 还有一个对象数组
total,每个对象都有_id属性 - 需要找出
element中每个值在total里对应_id匹配的项的索引,最终得到[1, 3]
为什么你之前的方法不对?
你用的 total.indexOf(e) 是直接比较整个元素是否相等,但 total 里的元素是对象,而 e 是字符串,两者类型和值都不一样,所以每次都会返回 -1,自然得不到正确结果。
正确的实现方法
方法一:用 map + findIndex(简单直接)
findIndex 允许我们自定义匹配条件,刚好可以用来检查对象的 _id 是否和目标字符串一致:
const element = ['abc', 'def'] const total = [ { _id: 'foo', something: 'else' }, { _id: 'abc' }, { _id: 'bar' }, { _id: 'def' } ] // 遍历element,对每个项找到total中对应_id的索引 const result = element.map(e => total.findIndex(item => item._id === e)) console.log(result) // 输出 [1, 3]
方法二:先构建映射表(大数据量更高效)
如果 total 数组很大,上面的方法每次都要遍历整个 total,效率会偏低。我们可以先把 total 里的 _id 和对应索引存到一个对象里,之后直接查找:
const element = ['abc', 'def'] const total = [ { _id: 'foo', something: 'else' }, { _id: 'abc' }, { _id: 'bar' }, { _id: 'def' } ] // 先构建_id到索引的映射 const idIndexMap = total.reduce((map, item, index) => { map[item._id] = index return map }, {}) // 直接从映射表中取索引 const result = element.map(e => idIndexMap[e]) console.log(result) // 输出 [1, 3]
这种方法的时间复杂度是 O(n + m)(n是total长度,m是element长度),比第一种的 O(n*m) 更适合处理大规模数据。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

