JavaScript перебирает 2D-массив и возвращает несоответствия

1

У меня два 2D-массива, я хочу сравнить их с помощью JavaScript, игнорировать совпадения и если есть несоответствия, чтобы вернуть всю строку в новый массив.

    var array1 = [ ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 [null,'ABC'],
                 ['6f93cfa0106f','xxx'],
                  ];

    var array2 = [ ['52a1fd0296fc','ABC'],
                   ['6f93cfa0106f','xxx'],
                   ['52a1fd0296fc','ABC'],
                   ['52a1fd0296fc','ABC'],
                   ['52a1fd0296fc','DEF'],
                   ['52a1fd0296fcasd','DEF'],  ];

Я хочу взять этот вывод, массивы, которые существуют в array2 и NOT в array1:

array3 = [['52a1fd0296fcasd','DEF'],['52a1fd0296fc','ABC']]

Любая идея, пожалуйста?

Теги:
arrays
multidimensional-array
2d

3 ответа

0

Вы можете использовать объединенные значения массива в качестве ключа и отфильтровать один раз из второго массива, указав уже вставленные элементы.

var array1 = [ ['52a1fd0296fc','DEF'], ['52a1fd0296fc','DEF'], ['52a1fd0296fc','DEF'], ['52a1fd0296fc','DEF'], [null,'ABC'], ['6f93cfa0106f','xxx']],
    array2 = [ ['52a1fd0296fc','ABC'], ['6f93cfa0106f','xxx'], ['52a1fd0296fc','ABC'], ['52a1fd0296fc','ABC'], ['52a1fd0296fc','DEF'], ['52a1fd0296fcasd','DEF']],
    hash = Object.create(null),
    result;

array1.forEach(function (a) {
     hash[a.join('|')] = true;
});

result = array2.filter(function (a) {
    return !hash[a.join('|')] && (hash[a.join('|')] = true);
});

console.log(result);
  • 0
    Запуск этого просто выводит [ [ null, "ABC" ] ] , это не ожидаемый результат. ОП хочет дедуплицировать основной массив
  • 0
    это как раз результат первого комментария ответа оп.
Показать ещё 11 комментариев
0

Здесь мой переход к нему, возможно, более компактный (и с использованием ES6)

Этот код удаляет повторяющиеся массивы из основного массива.

var array1 = [ ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 [null,'ABC'],
                 ['6f93cfa0106f','xxx'],
                 ['52a1fd0296fc','ABC'] ];

let array3 = []

array1.forEach( a1 => {
	if(!array3.find(a2 => a2[0]===a1[0] && a2[1]===a1[1])) array3.push(a1)
})

console.log(array3)
0

Просто обведите оба массива:

var array1 = [ ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 ['52a1fd0296fc','DEF'],
                 [null,'ABC'],
                 ['6f93cfa0106f','xxx'],
                 ['52a1fd0296fc','ABC'] ];

var array2 = [ ['52a1fd0296fc','ABC'],
                   ['6f93cfa0106f','xxx'],
                   ['52a1fd0296fc','ABC'],
                   ['52a1fd0296fc','ABC'],
                   ['52a1fd0296fc','DEF'] ];
                   
var array3 = [];
for(var i = 0; i<array1.length; ++i) {
	var a = array1[i];
	var found = false;
	for(var j = 0; j<array2.length; ++j) {
		var b = array2[j];
		if(a[0] == b[0] && a[1] == b[1]) {
			found = true;
			break;
		}
	}
	if(!found) {
		array3.push(a);
	}
}

console.dir(array3);

Я предполагаю, что вы хотите array1 без array2, а не наоборот.

  • 0
    Как получить эту кнопку «Выполнить фрагмент кода»?
  • 0
    Создайте фрагмент кода в своем ответе
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню