从数组中过滤对象,具有匹配两个值的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从数组中过滤对象,具有匹配两个值的差异相关的知识,希望对你有一定的参考价值。

我有一个数组,我想用另一个数组过滤。我的目标是使用两个值过滤数组,我希望结果只与这两个值完全匹配。这是我到目前为止:

const array = [
  {
    title: 'Title A',
    someOtherProps: [
      'AAA',
    ]
  }, {
    title: 'Title B',
    someOtherProps: [
      'AAA',
      'BBB',
    ]
  }, {
    title: 'Title C',
    someOtherProps: [
      'BBB',
      'CCC'
    ]
  }, {
    title: 'Title D',
    someOtherProps: [
      'BBB',
    ]
  }, {
    title: 'Title E',
    someOtherProps: [
      'CCC'
    ]
  },
]

const filter = [
  'AAA',
  'BBB',
]

let result = array.filter(obj => obj.someOtherProps.some(props => filter.includes(props)))
console.log(result);

所以我的结果是具有我的过滤值的对象。

// My Result
{
  title: 'Title A'
  someOtherProps: [
    'AAA',
  ]
}, {
  title: 'Title B'
  someOtherProps: [
    'AAA',
    'BBB',
  ]
}, {
  title: 'Title C'
  someOtherProps: [
    'BBB',
    'CCC'
  ]
}, {
  title: 'Title D'
  someOtherProps: [
    'BBB',
  ]
}

到现在为止还挺好。但我不需要所有具有其中一个值的对象。我需要对象,它正好结合了这两个值。

// Wanted Result
{
  title: 'Title B'
  someOtherProps: [
    'AAA',
    'BBB',
  ]
}

我找不到办法。我知道如何获得两个数组的差异。但如果你知道我的意思,我需要两个值的区别。

答案

Array#every()数组上使用filter并检查其所有值是否包含在对象的someOtherProps中。如果只需要一个对象,可以使用Array#find()

const array = [ { title: 'Title A', someOtherProps: [ 'AAA', ] }, { title: 'Title B', someOtherProps: [ 'AAA', 'BBB', ] }, { title: 'Title C', someOtherProps: [ 'BBB', 'CCC' ] }, { title: 'Title D', someOtherProps: [ 'BBB', ] }, { title: 'Title E', someOtherProps: [ 'CCC' ] }, ]

const filter = ['AAA','BBB',]

let res = array.find(x => filter.every( a => x.someOtherProps.includes(a)));
console.log(res)
另一答案

改变:

array.filter(x => filter.every( a => x.someOtherProps.includes(a)));

以上是关于从数组中过滤对象,具有匹配两个值的差异的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:从包含对象的多维数组中返回不匹配的值

如何在 es6 中仅比较和过滤两个对象数组中不匹配的数组

JavaScript 通过数组过滤并仅基于一个值的匹配返回

尝试使用过滤器设置具有唯一值的数组失败

按匹配不同数组的属性过滤字典数组

比较两个对象数组,并将匹配值的元素排除到JS中的新数组中