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

如何按名称匹配两个数组,提取登录值符合条件的元素?

解决方法:从newLogins中筛选符合条件的元素

你的需求是对比两个数组,仅保留newLogins中名称在oldLogins存在且login值大于oldLogins对应项的元素。先说说你原代码的问题:newLogins[item.name]这种写法不成立,因为newLogins是数组,不是以name为键的对象,没法直接通过名称索引元素。

下面是正确的实现方式,分两步走:

步骤1:将oldLogins转换为映射表

先把oldLogins转成一个{ name: login值 }的对象,这样可以快速查找某个名称对应的login值,提升效率:

const oldLoginsMap = oldLogins.reduce((acc, item) => {
  acc[item.name] = item.login;
  return acc;
}, {});

执行后得到的oldLoginsMap是:{ Anna: 0, Bob: 0, Sveta: 0 }

步骤2:过滤newLogins数组

遍历newLogins,只保留符合条件的元素:

const whoIsLogin = newLogins.filter(item => {
  // 两个条件:1. 名称在oldLogins中有记录;2. 当前login值更大
  return oldLoginsMap.hasOwnProperty(item.name) && item.login > oldLoginsMap[item.name];
});

完整代码

const oldLogins = [ { name: 'Anna', login: 0 }, { name: 'Bob', login: 0 }, { name: 'Sveta', login: 0 }, ];
const newLogins = [ { name: 'Romeo', login: 1 }, { name: 'Bob', login: 1 }, { name: 'Sveta', login: 2 }, { name: 'Jhon', login: 0 }, ];

const oldLoginsMap = oldLogins.reduce((acc, item) => {
  acc[item.name] = item.login;
  return acc;
}, {});

const whoIsLogin = newLogins.filter(item => 
  oldLoginsMap.hasOwnProperty(item.name) && item.login > oldLoginsMap[item.name]
);

console.log(whoIsLogin);

运行这段代码,就能得到你期望的输出:

[ { name: 'Bob', login: 1 }, { name: 'Sveta', login: 2 } ]

为什么这么做?

使用reduce生成映射表的好处是把查找操作的时间复杂度从O(n)降到O(1),如果你的数组元素很多,这种方式会比每次过滤都遍历oldLogins找对应项高效得多。

内容的提问来源于stack exchange,提问作者sayrecs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:35