Сравнить объекты массива и показать разницу - PullRequest
0 голосов
/ 27 сентября 2018

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

Вот код ниже, как я хотел бы добиться этого:

 var completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}];
    var invalidList = [{id:3},{id:4},{id:5},{id:6}];

    // filter the items from the invalid list, out of the complete list
    var validList = completedList.map((item) => {
        console.log(item.id)
        return item.id;
        //console.log(invalidList.id);
    }).filter(item => {
        Object.keys(invalidList).map(key => {
            console.log(invalidList[key].id)
            //return !invalidList[key].id.includes(item.id);
        });
    })

    console.log(validList); // Print [1,2,7,8]

    // get a Set of the distinct, valid items
    var validItems = new Set(validList);

Но это возвращает мне много id's как я могу отобразить как массив, так и фильтр по идентификатору свойства объекта?И только показать разницу между этими объектами массива.

Итак, в основном я ожидаю увидеть разницу между этими массивами, поэтому запишите различия в идентификаторах, как показано в этом примере: 1,2,5,6,7,8

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018
var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }];
var invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];

//get the items that are in the invalid list but not completed list
var filteredList1 = invalidList.filter((invalidListItem) => !completedList.find((item) => item.id === invalidListItem.id));

//get the items that are in  the completed list but not in the invalid list
var filteredList2 = completedList.filter((completedListItem) => !invalidList.find((item) => item.id === completedListItem.id));

//join the two arrays
var difference = filteredList1.concat(filteredList2);

//display the merged array and sort
console.log(difference.sort((item1, item2) => { return item1.id > item2.id ? 1 : item1.id < item2.id ? -1 : 0; }));

//outputs 1,2,5,6,7,8
0 голосов
/ 27 сентября 2018

Вы можете взять Set для получения разницы.Чтобы получить различия друг от друга (симметричное различие), вам нужно получить оба различия.

const
    difference = (a, b) => Array.from(b.reduce((s, v) => (s.delete(v), s), new Set(a))),
    getId = ({ id }) => id;

var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }],
    invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }],
    complete = completedList.map(getId),
    invalid = invalidList.map(getId),
    left = difference(complete, invalid),
    right = difference(invalid, complete),
    result = [...left, ...right]

console.log(result.join(' '));
console.log(left.join(' '));
console.log(right.join(' '));
0 голосов
/ 27 сентября 2018

Это должно сработать.

let completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}];
let invalidList = [{id:3},{id:4},{id:5},{id:6}];
// filter the items from the invalid list, out of the complete list
let temp1 = completedList.map(e => e.id);
let temp2 = invalidList.map(e => e.id);
let validList = temp1.filter(e => temp2.indexOf(e) === -1);
// find items only in invalidList
let difference = temp2.filter(e => temp1.indexOf(e) === -1);
console.log(validList); // Print [1,2,7,8]
console.log(difference);
0 голосов
/ 27 сентября 2018

Я часто полагаюсь на реализацию lodash для сравнения.В lo dash вы можете выполнить работу следующим образом:

_. IntersectionWith (arr1, arr2, _.isEqual) - для сходства _.differenceWith (arr1, arr2, _.isEqual) - для различий

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

Спасибо

...