Сравните 2 вложенных массива, чтобы вернуть дубликаты - PullRequest
0 голосов
/ 04 января 2019

У меня есть следующий код, который не работает с вложенными массивами (хотя он работает и с простыми массивами):

var array1 = [["501", 1800, "floorsRegion1", 0], ["502", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];
var array2 = [["501", 1800, "floorsRegion1", 0]];

var duplicatesArray = array1.filter(function(val) {
  return array2.indexOf(val) !== -1;
});
console.log(duplicatesArray); // should return [["501", 1800, "floorsRegion1", 0]]; but it doesn't currently

Если бы вместо вложенных массивов у меня были простые числа или строки, он быwork и 'duplicatesArray' будут содержать дубликаты.Но JS не сравнивает целые массивы как значения, поэтому мой код не работает.

Только val [0] необходимо сравнивать в этих вложенных массивах, но результирующий массив должен содержать целые вложенные массивы для дубликатов.

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

1 Ответ

0 голосов
/ 04 января 2019

Если вы заботитесь только об элементе с индексом 0, то вы можете отфильтровать с помощью some и проверить идентификатор некоторого элемента в array2 его первое значение равно первому значению текущего элемента, являющегося фильтрами:

var array1 = [["501", 1800, "floorsRegion1", 0], ["502", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];
var array2 = [["501", 1800, "floorsRegion1", 0]];

let filtered = array1.filter(arr => array2.some(arr2 => arr2[0] == arr[0]))
console.log(filtered)


// with two items in array2:

array1 = [["501", 1800, "floorsRegion1", 0], ["502", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];
array2 = [["501", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];

filtered = array1.filter(arr => array2.some(arr2 => arr2[0] == arr[0]))
console.log(filtered)

Это не очень эффективно, потому что он выглядит как array2 для каждого элемента в array1.Если бы массивы были большими, то стоило бы сделать поиск с помощью объекта или набора, который позволяет быстрее искать.Что-то вроде:

var array1 = [["501", 1800, "floorsRegion1", 0], ["502", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];
var array2 = [["501", 1800, "floorsRegion1", 0], ["503", 1800, "floorsRegion1", 0]];

let known = new Set(array2.map(item => item[0]))

let filtered = array1.filter(arr => known.has(arr[0]))
console.log(filtered)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...