Фильтровать объект из массива с разностью совпадения двух значений - PullRequest
1 голос
/ 14 апреля 2019

У меня есть массив, который я хочу отфильтровать с другим массивом.Моя цель - отфильтровать массив с двумя значениями, и я хочу, чтобы результат соответствовал только этим двум значениям.Это то, что у меня есть до сих пор:

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',
  ]
}

Я не могу найти способ.Я знаю, как получить разницу двух массивов.Но мне нужна разница двух значений, если вы понимаете, о чем я.

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Используйте 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)

Если вы хотите, чтобы все элементы соответствовали условию, используйте filter().

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.filter(x => filter.every( a => x.someOtherProps.includes(a)));
console.log(res)
0 голосов
/ 14 апреля 2019

Изменить с помощью этого:

array.filter(x => filter.every( a => x.someOtherProps.includes(a)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...