You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    })
问题分析

你这段代码有几个明显问题:

  1. 变量名写错:user1应该是users1
  2. 箭头函数语法错误:嵌套箭头函数的写法不符合规范,参数需要用括号包裹
  3. 判断逻辑错误:你的对象里根本没有id字段,没法通过i.id === item.id判断相等
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:05:24