JS中如何查找两个对象数组中相同元素在原数组的索引
问题描述
我有两个对象数组:
const users1 = [ { name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' }, { name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' }, { name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ] const users2 = [ { name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ]
我需要获取users1中存在于users2的元素的索引,期望结果为[{1: true}, {3: true}]。我尝试了以下代码,但实现不正确:
const arr = user1.filter((item, index) => user2.map(i) => { if(i.id === item.id) return {index: true} return null; })
问题分析
你这段代码有几个明显问题:
- 变量名写错:
user1应该是users1 - 箭头函数语法错误:嵌套箭头函数的写法不符合规范,参数需要用括号包裹
- 判断逻辑错误:你的对象里根本没有
id字段,没法通过i.id === item.id判断相等 filter的用法错误:filter需要返回布尔值来筛选元素,但你这里既没返回判断结果,还试图在里面生成目标对象,逻辑完全不对
解决方案
要实现需求,我们可以这样做:
代码实现
// 先写个函数判断两个用户对象是否完全匹配 const isSameUser = (a, b) => { return a.name === b.name && a.age === b.age && a.gender === b.gender && a.city === b.city && a.country === b.country; }; // 用reduce遍历users1,收集符合条件的索引对象 const result = users1.reduce((acc, currentUser, index) => { // 检查当前用户是否在users2里存在 const existsInUsers2 = users2.some(user => isSameUser(user, currentUser)); if (existsInUsers2) { acc.push({ [index]: true }); } return acc; }, []); console.log(result); // 输出: [{1: true}, {3: true}]
代码解释
isSameUser:因为对象是引用类型,直接===比较的是内存地址,所以必须逐个字段对比才能确定是不是同一个用户reduce:用来遍历数组并收集结果,一次遍历就能完成筛选和转换,比先filter再map更高效some:检查users2里有没有匹配的用户,只要找到一个就停止遍历,避免不必要的性能消耗
内容的提问来源于stack exchange,提问作者Festina
相关产品推荐
相关产品推荐

