Как получить только указанные c элементов из массива, сравнив их в javascript? - PullRequest
0 голосов
/ 06 мая 2020

У меня два массива. Второй arrayB содержит элементы, идентичные arrayA. Теперь после сравнения массивов arrayA должен иметь только те значения, которых нет в arrayB. Подскажите, пожалуйста, лучший способ сделать это.

let arrayA = [{ "displayName": "John" }, { "displayName": "Sandra" },{ "displayName": "Peter" }]
let arrayB = [{ "name": "Bobby" }, { "name": "John" }, { "name": "Sandra" }]

arrayA.forEach(function(cust, index) {
  arrayB.forEach(function(comp) {
    if (comp.name == cust.displayName) {
      delete arrayA[index] 
    }
  })
})
    console.log("Final"+JSON.stringify(arrayA))

Вывод -> Final [null, null, {"displayName": "Peter"}]

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Отфильтровать и оставить только те, которых нет в другом массиве

let arrayA = [{ "displayName": "John" }, { "displayName": "Sandra" },{ "displayName": "Peter" }]
let arrayB = [{ "name": "Bobby" }, { "name": "John" }, { "name": "Sandra" }]

arrayA = arrayA.filter(a =>
  !arrayB.find(b => a.displayName === b.name)
);

console.log("Final"+JSON.stringify(arrayA))
0 голосов
/ 06 мая 2020

Чтобы удалить элементы, которых нет в arrayB, вы можете использовать map() и filter():

arrayB = arrayB.map((key) => key.name)
arrayA = arrayA.filter((key) => arrayB.includes(key.displayName))

В первой строке вы получите массив только с именами Во второй строке вы удалите из arrayA элементы, которых нет в arrayB

Вы также можете добавить map():

arrayB = arrayB.map((key) => key.name)
arrayA = arrayA.filter((key) => arrayB.includes(key.displayName))
    .map((key) => key.displayName)

Таким образом, у вас будет только второй массив имена, но не предметы.

0 голосов
/ 06 мая 2020

let arrayA = [{ "displayName": "John" }, { "displayName": "Sandra" },{ "displayName": "Peter" }]
let arrayB = [{ "name": "Bobby" }, { "name": "John" }, { "name": "Sandra" }]

const shouldFilterOutByName = {};
for (let item of arrayB) {
  shouldFilterOutByName[item.name] = true;
}
const filteredAry = arrayA.filter(item => !shouldFilterOutByName[item.displayName]);
console.log(filteredAry);

Решение Taplar, вероятно, именно то, что вам нужно. Причина, по которой я не удалил свой ответ, заключается в том, что важна временная сложность. Решение Таплара имеет временную сложность O (n ^ 2), а мое решение - O (n).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...