首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JavaScript使用两个对象数组进行过滤

使用JavaScript使用两个对象数组进行过滤
EN

Stack Overflow用户
提问于 2020-04-18 17:13:54
回答 5查看 47关注 0票数 0

我有一个数组,如下所示:

代码语言:javascript
运行
复制
var arrOne = [{id: 3},{id: 8},{id: 12}];

另一个数组如下所示:

代码语言:javascript
运行
复制
var arrTwo = [
  {id: 1, val: 'Adam'},
  {id: 3, val: 'Bailey'},
  {id: 8, val: 'Cathy'},
  {id: 12, val: 'David'},
  {id: 15, val: 'Earl'}
];

我想基于arrTwo迭代arrOne,并从arrTwo中获取val值。因此,结果应该是:

代码语言:javascript
运行
复制
var result = ['Bailey', 'cathy', 'David'];

尝试将.map与.filter连接:

代码语言:javascript
运行
复制
arrOne.map(arOne => arrTwo.filter(artwo => {
    if(arOne.id === artwo.id) {
      return artwo.val
    } else {
      return false;
    }
}));

但它给了我一切,在它是假的地方,它在那里增加了假,我不想要。任何我出错的想法都会被感激的。

按norbitrial的回答编辑:

代码语言:javascript
运行
复制
const arrOne = [{id: 3},{id: 8},{id: 12}];
const arrTwo = [
                 {id: 1, val: 'Adam'}, 
                 {id: 3, val: 'Bailey'}, 
                 {id: 8,    val: 'Cathy'}, 
                 {id: 12, val: 'David'}, 
                 {id: 15, val: 'Earl'}
               ];

const result = arrOne.map(({id}) => arrTwo.find(e => {
  const someCond = someConditionaEval();
  if(someCond && e.id === id) {
     return e;
  } else {
     return false;
  }
}).val); //this breaks
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-04-18 17:15:52

使用.map().find()组合:

代码语言:javascript
运行
复制
const arrOne = [{id: 3},{id: 8},{id: 12}];
const arrTwo = [{id: 1, val: 'Adam'}, {id: 3, val: 'Bailey'}, {id: 8, val: 'Cathy'}, {id: 12, val: 'David'}, {id: 15, val: 'Earl'}];

const result = arrOne.map(({id}) => arrTwo.find(e => e.id === id).val);

console.log(result);

我希望这能帮到你!

票数 3
EN

Stack Overflow用户

发布于 2020-04-18 17:17:26

您可以在arrTwo上使用arrTwo方法,然后使用.includes()方法从arrTwo获取过滤对象,然后使用.map()只从每个筛选对象获取val属性值,如下所示:

代码语言:javascript
运行
复制
var arrOne = [{id: 3},{id: 8},{id: 12}];
var arrTwo = [{id:1,val:"Adam"},{id:3,val:"Bailey"},{id:8,val:"Cathy"},{id:12,val:"David"},{id:15,val:"Earl"}];
             
var result = arrTwo.filter(a => arrOne.map(o=>o.id).includes(a.id)).map(o=>o.val)
console.log( result )

票数 1
EN

Stack Overflow用户

发布于 2020-04-18 17:19:25

通过val idarrTwo创建一个地图,然后映射arrOne,然后使用id从地图中提取val

为什么我更喜欢创建一个映射/字典(对象)而不是使用Array.map()Array.find()

例如,由于复杂性-- Array.map() with Array.find()是O(n * m),同时创建一个映射,然后使用Array.map()获取值是O(n + m)。但是,如果您有两个小数组,这实际上不应该损害实际性能。

代码语言:javascript
运行
复制
const arrOne = [{id: 3},{id: 8},{id: 12}];
const arrTwo = [{id: 1, val: 'Adam'}, {id: 3, val: 'Bailey'}, {id: 8, val: 'Cathy'}, {id: 12, val: 'David'}, {id: 15, val: 'Earl'}];

const valById = new Map(arrTwo.map(({ id, val }) => [id, val]));

const result = arrOne.map(o => valById.get(o.id));

console.log(result);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61293160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档