在Javascript中,根据不同的搜索属性值数组,在一个数组中匹配一组对象。

3
有没有更好的方法根据特定属性的一组可能值来过滤对象数组?
这种方法可行但似乎有点笨重。
const all = [
  {id: 1}, {id: 2}, {id: 3} ...
]
const ids = [2, 3];

const selected = (all, ids) =>
  all.filter(obj => ids.map(id => id === obj.id).some(match => match));

selected(all, ids);
// [{id: 2}, {id: 3}]

在 Python 中,它可能是这样的:
selected = [obj for obj in all if obj.id in ids]
3个回答

2
您可以使用Array.filter()Array.includes()轻松过滤数组:

const all = [ {id: 1}, {id: 2}, {id: 3} ];
const ids = [2, 3];

const selected = (all, ids) => all.filter(obj => ids.includes(obj.id));
  
console.log(selected(all,ids));


2

您可以使用Array.filter对象解构Array.includes,例如:

const all = [{
  id: 1,
}, {
  id: 2,
}, {
  id: 3,
}];

const ids = [
  2,
  3,
];

const selected = (all, ids) => all.filter(({
  id,
}) => ids.includes(id));

console.log(selected(all, ids));
// [{id: 2}, {id: 3}]


好答案!不过,我必须说,多行解构看起来很丑。 - ibrahim mahrir
同上 - 答案正确,但不确定是否需要解构,第二个答案没有解构更易读。 - Guy Bowden
@GuyBowden 这更多是个人意见。在这里使用解构或不使用解构都没有一个“好”的答案。我个人更喜欢使用它,这样你就可以在函数开始时确切地知道使用了什么。避免使用点符号表示法。尽管如此,我尊重你在这里不使用它的选择 :) - Orelsanpls
@GuyBowden 这段代码还算可读。去除换行符后是这样的:all.filter(({id}) => ids.includes(id)) - ibrahim mahrir
@ibrahimmahrir 这是我应用于我的代码的一部分规范(始终打开json并在每个键后面放置逗号)。当然,您也可以将其放在一行中 :) - Orelsanpls

0
你可以使用 Set 来存储所需的 id 并进行筛选检查。

const
    all = [{ id: 1 }, { id: 2 }, { id: 3 }],
    ids = [2, 3],
    result = all.filter((s => ({ id }) => s.has(id))(new Set(ids)));

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接