Сравните два массива и создайте новый массив с различиями с учетом дубликатов - PullRequest
0 голосов
/ 17 мая 2018

Допустим, у меня есть два массива, содержащих числа ..

[1,1,7,6], [1,7]

Мне нужно создать новый массив изчисла, которые не появляются во втором массиве, но также учитывают наличие двух единиц.

Я пытался использовать _.difference([1,1,7,6],[1,7])

от lodash, а также некоторые другие простые функции Javascript, но онине учитывайте наличие двух единиц, поэтому я просто получаю [6]

Мой желаемый результат будет [1,6]

Порядок не имеет значения

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Вы можете сделать что-то вроде:

const diff = (array1, array2) => {

    const _array2 = Array.from(array2);
    const difference = [];

    array1.forEach((array1Item) => {
        const matchedIndex = _array2.findIndex(array2Item => array2Item === array1Item);
        if (matchedIndex > -1) {
            // Remove from second array
            _array2.splice(matchedIndex, 1);
        } else {
            // No match found, add to difference array
            difference.push(array1Item);
        }
    });

    // Return the remaining items in _array2 and difference
    return [ ..._array2, ...difference ];
}

Скопировав второй массив, вы можете удалить из него любые совпадения. И, комбинируя это с сопоставлением array1> array2, вы получаете различия в обоих направлениях, включая дубликаты.

Рабочая скрипка: https://jsfiddle.net/3v34tjnq/

0 голосов
/ 17 мая 2018

Более короткий скрипт:

function differenceWithDuplicates(a, b) {
    while(b.length) a.splice(a.indexOf(b[0]), +a.includes(b.shift()));
    return a;
}
console.log(differenceWithDuplicates([1, 1, 7, 6],[1, 7]));

Или просто сделайте время, не вызывая его внутри функции.

0 голосов
/ 17 мая 2018

Итерация по первому массиву. Для каждого элемента в первом массиве ищите второй. Если он существует, вставьте null в этот индекс. Если он не существует, переместите его в новый массив со своими различиями

const difference = (arr1, arr2) => {
    const differenceArr = []
    for (let i = 0; i < arr1.length; i++) {
        const matchingIdx = arr2.indexOf(arr1[i]);
        if (matchingIdx !== -1) {
            arr2[matchingIdx] = null
        } else {
            differenceArr.push(arr1[i])
        }
    }
    return differenceArr
}

console.log(difference([1, 1, 7, 7, 6],[1, 1, 7]))
...