Фильтрация массива значений по массиву значений объекта - PullRequest
0 голосов
/ 19 апреля 2020

В Javascript у нас есть массив:

let arr1 = [1, 2, 3, 4, 5];

... и массив объектов:

let arr2 = [ {name: "banana", id: 1},
             {name: "mango", id: 3} ];

Я хочу удалить все элементы из arr1 где arr2 id = arr1 и возвращает массив, подобный этому:

[2, 4, 5]

Вот что я пробовал, но, похоже, это не работает.

let newArr = arr1.filter(
    x => !arr2.includes(e => e.id === x)
)

Как мне этого добиться? Я могу использовать lodash, а также ES6.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2020

Метод .includes() не позволяет передавать в него метод для определения равенства. Вместо этого вы можете использовать .some(), что позволяет вам указать это:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const newArr = arr1.filter(x => !arr2.some(e => e.id === x))
console.log(newArr);

Более эффективным подходом было бы получить все свойства id из объектов в вашем массиве и поместить их в Set для быстрого просмотра. -до. Затем используйте .filter() с .has() примерно так:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const idSet = new Set(arr2.map(({id}) => id));
const newArr = arr1.filter(x => !idSet.has(x))
console.log(newArr);
3 голосов
/ 19 апреля 2020

Вы можете сначала создать временное значение id и age , затем использовать filter() с includes()

let arr1 = [1, 2, 3, 4, 5];
let arr2 = [ {name: "banana", id: 1},
         {name: "mango", age: 3} ];
let temp = arr2.map(i => i.id || i.age);
let res = arr1.filter(i => !temp.includes(i));
console.log(res);
1 голос
/ 19 апреля 2020
let arr1 = [1, 2, 3, 4, 5];

let arr2 = [ {name: "banana", id: 1},
             {name: "mango", id: 3} ];

arr1.map((item,index) => 
  arr2.map(object => {
    if(item == object.id) arr1.splice(index,1)
  })
)

console.warn(arr1) /// output [2, 4, 5]
...