如何按名称匹配两个数组,提取登录值符合条件的元素?
解决方法:从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
相关产品推荐
相关产品推荐

