使用另一个对象数组过滤Javascript对象数组

3
我有一个列表。
var list = [
  {name: 'Hello', ads: true, pas: ['Av', 'Sd', 'Qr']},
  {name: 'Fre', ads: false, pas: ['Sd', 'Bc']},
  {name: 'Nat', ads: false, pas: ['Bc', 'Mo', 'Rr']},
  {name: 'Bor', ads: true, pas: ['Bo', 'Be', 'De']},
  {name: 'Arg', ads: true, pas: ['Ar', 'Na', 'Br']},
];

数组的过滤器

var filter = [
 'Sd','Be'
];

我尝试使用filter过滤,但它没有过滤出结果。

list
  .filter(function(ls) {
    return ls.pas
      .filter(function(p){
        return filter.indexOf(p) > -1;
      })
  })

我期望的输出

[
  {name: 'Hello', ads: true, pas: ['Av', 'Sd', 'Qr']},
  {name: 'Fre', ads: false, pas: ['Sd', 'Bc']},
  {name: 'Bor', ads: true, pas: ['Bo', 'Be', 'De']}
];

使用 $.inArray() - Kinshuk Lahiri
我不能使用jQuery,因为它在React内部,但我可以使用lodash,只是不知道如何使用它。 - Wimal Weerawansa
为什么你的最后一个问题的答案(https://dev59.com/vpvga4cB1Zd3GeqP5q84)对你不起作用? - Nina Scholz
上一个问题只有一层过滤,而这个集合包含多个级别的数组需要进行筛选。 - Wimal Weerawansa
2个回答

3
您可以使用 some() 方法来检查当前对象的 pas 数组中是否有任何元素在 filter 数组中。

var list = [
  {name: 'Hello', ads: true, pas: ['Av', 'Sd', 'Qr']},
  {name: 'Fre', ads: false, pas: ['Sd', 'Bc']},
  {name: 'Nat', ads: false, pas: ['Bc', 'Mo', 'Rr']},
  {name: 'Bor', ads: true, pas: ['Bo', 'Be', 'De']},
  {name: 'Arg', ads: true, pas: ['Ar', 'Na', 'Br']},
];

var filter = [
 'Sd','Be'
];

var result = list.filter(function(e) {
  return e.pas.some(function(a) {
    return filter.indexOf(a) != -1
  })
})

console.log(result);


0

使用ES6看起来非常不错:

const list = [
   {name: 'Hello', ads: true, pas: ['Av', 'Sd', 'Qr']},
   {name: 'Fre', ads: false, pas: ['Sd', 'Bc']},
   {name: 'Nat', ads: false, pas: ['Bc', 'Mo', 'Rr']},
   {name: 'Bor', ads: true, pas: ['Bo', 'Be', 'De']},
   {name: 'Arg', ads: true, pas: ['Ar', 'Na', 'Br']},
],
filter = ['Sd','Be']

list.filter(a=>a.pas.some(a=>filter.includes(a))

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