Как сравнить два объекта и удалить дубликаты - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь сравнить два объекта и удалить дублирующее значение из первого путем сращивания.Есть ли лучшее решение для достижения этой

Record1 = [{"ID":"938"},{"ID":"939"}];

Record2 = [{"IDN":"938"},{"IDN":"939"}];

for (var k = 0; k < Record1.length; k++) {
    for (var l = 0; l < Record2.length; l++) {
        if (Record1[k].ID == Record2[l].IDN) {
            Record1.splice(k, 1);
            break;
        }
    }
}

console.log(''+ JSON.stringify(Record1));

Actual result> Record1 = [{"ID":"939"}];

Expected result> Record1 = [];

1 Ответ

1 голос
/ 20 марта 2019

Вы мутируете Record1, пока вы повторяете его с циклом for, начиная с индекса 0 и увеличивая его вверх - это означает, что некоторые элементы будут пропущены.(например, если вы break при k из 0, то элемент новый с индексом 0 после сращивания никогда не будет проверен.) Итерация с end из Record1 вместо этого, чтобы индекс k, который был вставлен, всегда ссылался на элемент с соответствующим индексом:

Record1 = [{"ID":"938"},{"ID":"939"}];

Record2 = [{"IDN":"938"},{"IDN":"939"}];

for (var k = Record1.length - 1; k >= 0; k--) {
    for (var l = 0; l < Record2.length; l++) {
        if (Record1[k].ID == Record2[l].IDN) {
            Record1.splice(k, 1);
            break;
        }
    }
}

console.log(''+ JSON.stringify(Record1));

Или, что еще лучше, используйте Set для уменьшения сложности вычислений и filter для создания нового массива:

Record1 = [{"ID":"938"},{"ID":"939"}];
Record2 = [{"IDN":"938"},{"IDN":"939"}];

const IDNs = new Set(Record2.map(({ IDN }) => IDN));
const Record1WithoutDupes = Record1.filter(({ ID }) => !IDNs.has(ID));
console.log(Record1WithoutDupes);
...