2017-01-01 5 views
4

У меня есть 2 массивы:Как получить разницу между двумя массивами?

arr1 = [[11,12],[11,13],[11,14], [12,13]]; 
arr2 = [[11,13],[11,14]]; 

Ожидаемый результат [[11,12],[12,13]].

Как я могу получить разницу между двумя массивами? Я использую lodash _.difference, но это дает мне неправильный ответ.

+0

Есть много дискуссий на массив сравнить здесь: http://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript .. решение будет быть расширением к нему –

+0

Они оба названы 'arr1': | –

ответ

0

Используя только JavaScript, и только для этого и подобных примеров

var a1 = [[11,12],[11,13],[11,14], [12,13]]; 
var a2 = [[11,13],[14,11]]; 
var a3 = a1.filter(ar1 => !a2.some(ar2 => ar1.every(n1 => ar2.includes(n1)))) 
console.log(a3); // [[11,12],[12,13]] 

Есть слишком много критериев, чтобы создать общее решение.

Например, [11,12] то же, что и [12,11], возможно, ссылки на один и тот же массив равны (ar1 === ar2) как true. Что делать, если в одном и том же массиве есть две одинаковые записи, а в другом - вы отфильтровываете один или сохраняете его? Количество вопросов может продолжаться в течение некоторого времени, и становится все хуже, чем глубже вложенность и тем больше количество типов, хранящихся в массиве.

var a1 = [[11,12],[11,13],[11,14], [12,13]] 
 
var a2 = [[11,13],[14,11],[12,14]]; 
 
a3 = []; 
 
[[a1,a2],[a2,a1]].forEach(a=>{ 
 
    a3.push(...a[0].filter(
 
     ar1 => !a[1].some(
 
      ar2 => ar1.every(
 
       n1 => ar2.includes(n1) 
 
      ) 
 
     ) 
 
    )) 
 
}); 
 
console.log("[["+a3.join("], [")+"]]")

+0

Это проверяет только 'a1' над' a2'. Он потерпит неудачу для случая var v1 = [[11,12], [11,13], [11,14], [12,13]]; var a2 = [[11,13], [14,11], [12,14]]; ' – Redu

+0

@redu. Точно так оно и есть, без подробного набора правил относительно того, что составляет равенство и неравенство и т. д. ... вы можете построить только конкретный тестовый пример. Нет решения для этой проблемы, которая будет работать для всех случаев без дополнительной информации, включаемой в качестве аргументов. Сколько нужно? – Blindman67

5

Вам необходимо использовать _.differenceWith(), потому что вам нужно сравнить элементы суб-массивов. По умолчанию он просто проверяет, являются ли подмассивы одними и теми же объектами, которые, по-видимому, не являются.

result = _.differenceWith(arr1, arr2, _.isEqual); 
0

Вы могли бы сделать это без lodash. Кончик woud будет карта подмассива в строки, чтобы сделать сравнение легко

var arr1 = [[11,12],[11,13],[11,14], [12,13]]; 
 
var arr2 = [[11,13],[11,14],[12,14]]; 
 

 
var res = arr1.concat(arr2).map(x => x.join(",")).filter((x,i,arr) => arr.indexOf(x) === arr.lastIndexOf(x)).map(x => x.split(",")); 
 

 
console.log(res);

+0

Это проверяет только a1 на a2. Он потерпит неудачу для случая var v1 = [[11,12], [11,13], [11,14], [12,13]]; var a2 = [[11,13], [14,11], [12,14]]; ' – Redu

+0

@Redu Я только что исправил ошибку –

0

Всего несколько строк чистого JS достаточно для такого разделения (союз ') работа. Кроме того, вы должны убедиться в том, что оба массива проверяются по другому.

var arr1 = [[11,12],[11,13],[11,14],[12,13]], 
 
    arr2 = [[11,13],[11,14],[12,14]]; 
 
    res = arr1.reduceRight((p,c,i,a) => { var fi = p.findIndex(s => c.every(n => s.includes(n))); 
 
              return fi !== -1 ? (a.splice(i,1), 
 
                   p.splice(fi,1), 
 
                   p) 
 
                  : p; 
 
             },arr2) 
 
       .concat(arr1); 
 
console.log(res);

 Смежные вопросы

  • Нет связанных вопросов^_^