Как отфильтровать массив объектов с массивом чисел - PullRequest
0 голосов
/ 30 января 2020

Учитывая массив объектов arr1 как отфильтровать в новый массив объекты, которые не имеют свойства, равного любому значению в массиве чисел arr2

const arr1 = [
  {
    key: 1,
    name: 'Al'
  },
  {
    key: 2,
    name: 'Lo'
  },
  {
    key: 3,
    name: 'Ye'
  }
];

const arr2 = [2, 3]

// Failed attempt
const newArr = arr1.filter(obj1 => arr2.some(num1 => num1 !== obj1.key))
console.log(newArr)

// Expected: [{ key: 1, name: 'Al' }]

// Received: [
//   { key: 1, name: 'Al' },
//   { key: 2, name: 'Lo' },
//   { key: 3, name: 'Ye' }
// ]

Ответы [ 6 ]

4 голосов
/ 30 января 2020

Используя ваш синтаксис:

Вы должны соответствовать на some в случае, если он одинаковый и не отличается. Тогда, если оно совпадает, не сохраняйте значение.

const arr1 = [
  {
    key: 1,
    name: 'Al',
  },
  {
    key: 2,
    name: 'Lo',
  },
  {
    key: 3,
    name: 'Ye',
  },
];

const arr2 = [2, 3];

const newArr= arr1.filter(x => !arr2.some(y => y === x.key));

console.log(newArr);

Альтернативный синтаксис ниже:

const arr1 = [{
    key: 1,
    name: 'Al',
  },
  {
    key: 2,
    name: 'Lo',
  },
  {
    key: 3,
    name: 'Ye',
  },
];

const arr2 = [2, 3];

const newArr = arr1.filter(({
  key,
}) => !arr2.some(y => y === key));

console.log(newArr);

Тем не менее, вы должны использовать Array.includes(), как ответили некоторые люди. Проще для того же результата

const arr1 = [{
    key: 1,
    name: 'Al',
  },
  {
    key: 2,
    name: 'Lo',
  },
  {
    key: 3,
    name: 'Ye',
  },
];

const arr2 = [2, 3];

const newArr = arr1.filter(({
  key,
}) => !arr2.includes(key));

console.log(newArr);
2 голосов
/ 30 января 2020

Это будет работать для вас:

const arr1 = [
  {
    key: 1,
    name: 'Al'
  },
  {
    key: 2,
    name: 'Lo'
  },
  {
    key: 3,
    name: 'Ye'
  }
];

const arr2 = [2, 3]

const filtered = arr1.filter(val => !arr2.includes(val.key))

console.log(filtered)

:)

2 голосов
/ 30 января 2020

Вы можете сделать это

const newArr = arr1.filter(obj => !arr2.includes(obj.key));
1 голос
/ 30 января 2020

Для таких ситуаций, как этот набор также очень круто (и для больших массивов более производительным):

const arr1 = [
  {
    key: 1,
    name: 'Al'
  },
  {
    key: 2,
    name: 'Lo'
  },
  {
    key: 3,
    name: 'Ye'
  }
];

const arr2 = [2, 3]
const arr2Set = new Set(arr2);

const newArr = arr1.filter(obj1 => !arr2Set.has(obj1.key))
console.log(newArr)
0 голосов
/ 30 января 2020

Вам нужно отфильтровать arr1, когда элемент arr1 не существует в arr2, поэтому я думаю, что было бы лучше использовать indexOf() как этот

const newArr = arr1.filter(obj1 => arr2.indexOf(obj1.key) === -1)

, если элемент не существует в arr2, это вернет -1, что вам нужно.

0 голосов
/ 30 января 2020

Вы можете использовать indexOf так:

const newArr = arr1.filter(obj => arr2.indexOf(obj.key) > -1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...