Разница между двумя массивами, когда элементы являются массивом - PullRequest
0 голосов
/ 27 декабря 2018
var a = [["Green","Medium"],["Green","Small"],["Medium","Red"],["Red","Small"]];

var b = [["Green","Medium"],["Green","Small"],["Medium","Red"]];

Так что мой результат будет [["Red","Small"]]

Не то, что a.filter(x => !b.includes(x)) не будет работать, потому что все элементы являются массивом.Я пробовал что-то подобное

    var diff = [];
    a.forEach((res, i) => {
      b.forEach((res2, j) => {
        if (i === j && !_.isEqual(res, res2)) {
          diff.push(res);
        }
      });
    });
console.log(diff);

Это не работает, когда разные элементы последние позиции

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018
var a = [["Green","Medium"],["Green","Small"],["Medium","Red"],["Red","Small"]];

var b = [["Green","Medium"],["Green","Small"],["Medium","Red"]];

var c = b.map(ele=>JSON.stringify(ele));

var p = a.filter(ele=>!c.includes(JSON.stringify(ele)))

console.log(p)
0 голосов
/ 27 декабря 2018

Поскольку вы уже используете lodash, вы можете использовать комбинацию фильтра и каждого для сравнения двух массивов.

var a = [["Green","Medium"],["Green","Small"],["Medium","Red"],["Red","Small"]];

var b = [["Green","Medium"],["Green","Small"],["Medium","Red"]];


var unique = a.filter(a=> b.every(b=> !_.isEqual(a, b)));
console.log(unique)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
0 голосов
/ 27 декабря 2018

В lodash вы можете использовать _.differenceWith() и поставлять _.isEqual() в качестве компаратора для глубокого сравнения:

const c = _.differenceWith(a, b, _.isEqual);

Полный фрагмент:

const a = [["Green","Medium"],["Green","Small"],["Medium","Red"],["Red","Small"]];
const b = [["Green","Medium"],["Green","Small"],["Medium","Red"]];

const c = _.differenceWith(a, b, _.isEqual);

console.log(c);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 27 декабря 2018

Для решения O(N), в котором не требуется библиотека, я бы map b до Set строк за счет строкового преобразования содержимого каждого подмассива, затем filter aв зависимости от того, содержатся ли в наборе a элементы в наборе:

var a = [["Green","Medium"],["Green","Small"],["Medium","Red"],["Red","Small"]];
var b = [["Green","Medium"],["Green","Small"],["Medium","Red"]];

const bSet = new Set(b.map(arr => JSON.stringify(arr)));
const aFiltered = a.filter(arr => !bSet.has(JSON.stringify(arr)));
console.log(aFiltered);

(Set.has обычно O(1), в отличие от методов Array, таких как includes и indexOf)

...