【问题标题】:How to filter an array of objects with names from another array of objects [duplicate]如何从另一个对象数组中过滤具有名称的对象数组[重复]
【发布时间】:2021-01-09 20:00:26
【问题描述】:

我是 Javascript 新手,我正在为如何使用地图、过滤器、查找和其他功能而苦恼。我有两个对象数组,我想用第二个过滤第一个。

const users = [ 
  { name: 'Anna', age: 22, gender: 'F' }, 
  { name: 'John', age: 25, gender: 'M' },
  { name: 'Mary', age: 27, gender: 'F' },
  { name: 'Joe',  age: 30, gender: 'M' } 
] 

const filter = [ 
  { name: 'Anna' }, 
  { name: 'John' } 
] 

// Here is the expected result:
const expected_result = [ 
  { name: 'Anna', age: 22, gender: 'F' },
  { name: 'John', age: 25, gender: 'M' } 
] 

有谁知道最好的方法是什么?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 查看上面复制的second answer

标签: javascript arrays object


【解决方案1】:

这样的?

const filteredUsers = users.filter(user=>filter.find(x=>(x.name==user.name)&&(x.age==user.age)&&(x.gender==user.gender));


最好给每个人一个唯一的id。

const filteredUsers = users.filter(user=>filter.find(x=>(x.id==user.id));


【讨论】:

  • 在这里使用 .some() 而不是 .find() 可能更有意义(因为过滤器希望返回布尔值,从而节省转换)
  • 是的,真的把我宠坏了
【解决方案2】:

const users = [{
    name: 'Anna',
    age: 22,
    gender: 'F',
  },
  {
    name: 'John',
    age: 25,
    gender: 'M',
  },
  {
    name: 'Mary',
    age: 27,
    gender: 'F',
  },
  {
    name: 'Joe',
    age: 30,
    gender: 'M',
  },
];

const filter = [{
    name: 'Anna',
  },
  {
    name: 'John',
  },
];

const result = users.filter(value => {
  const isExist = filter.findIndex(data => data.name === value.name);
  return isExist === -1 ? false: true;
});

console.log(result)

【讨论】:

  • 使用名字和名字进行比较对于小事来说很好。但是在对象上使用过滤器时最好使用 ID。
  • @altruios 同意你的观点,但在这种特殊情况下我们没有 ID。
【解决方案3】:

“什么是最好的方法”是一个见仁见智的问题,但如果你有一个大的过滤器对象,那么首先将它转换为一个临时集合是有意义的:

function filterBy(users, filter) {
    let set = new Set(filter.map(({name}) => name)); // for faster lookup
    return users.filter(({name}) => set.has(name));
}

// demo
const users = [{name: 'Anna',age: 22,gender: 'F',},{name: 'John',age: 25,gender: 'M',},{name: 'Mary',age: 27,gender: 'F',},{name: 'Joe',age: 30,gender: 'M',},];
const filter = [{name: 'Anna',},{name: 'John',}];
console.log(filterBy(users, filter));

【讨论】:

  • 使用名字和名字进行比较对于小事来说很好。但是在对象上使用过滤器时最好使用 ID。
  • @altruios,我想这个评论是针对 OP 的。没有人声称要过滤的东西必须是独一无二的……一个人可以过滤任何东西;是否独特并不重要。
  • 如果集合只是被 name 属性拉取的唯一值。如果有重复的名字,它将失败。
  • 不,它不会使 altruios 失败,因为结果仍然会有那些重复项。
  • new Set()... set 只是唯一的项目... const users = [{name: 'Anna',age: 22,gender: 'F',},{name: ' Anna',年龄:43,性别:'F',},{姓名:'John',年龄:25,性别:'M',},{姓名:'Mary',年龄:27,性别:'F' ,},{name: 'Joe',age: 30,gender: 'M',},];过滤器会在这里失败。如果该集合中只有 1 个 Anna。因为 set 返回一个独特项目的集合。
猜你喜欢
  • 2023-02-03
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2019-05-05
  • 2018-10-03
相关资源
最近更新 更多