как получить уникальные записи из 2 javascript массивов? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть два массива. Который имеет мало общих ценностей. Я хочу отфильтровать эти предметы. Я пытался es6 indexOf и includes операторов, но не повезло.

arr1 = [ 
["Test1", 20, "table", "Sample1", "NA"], 
["Test2", 20, "table", "Sample2", "NA"],
["Test3", 20, "table", "Sample3", "NA"],
["Test4", 20, "table", "Sample4", "NA"],
["Test5", 20, "table", "Sample5", "NA"]
];

arr2 = [
["Test2", 20, "table", "Sample2", "NA"],
["Test4", 20, "table", "Sample4", "NA"],
["Test5", 20, "table", "Sample5", "NA"],
["Test6", 20, "table", "Sample6", "NA"],
["Test7", 20, "table", "Sample7", "NA"]
];

let unique = arr2.filter((item, i, ar) => arr1.indexOf(item) === -1);

console.log(unique); //returns all 5

   let result = [...arr1, ...unique];

   console.log('length is:', result.length); //length should be 7 but its 10

Ответы [ 3 ]

4 голосов
/ 12 февраля 2020

Создает набор из строковых подмассивов. Отфильтруйте оба массива по наличию текущего строкового подмассива в наборе other массива:

const arr1 = [ 
  ["Test1", 20, "table", "Sample1", "NA"], 
  ["Test2", 20, "table", "Sample2", "NA"],
  ["Test3", 20, "table", "Sample3", "NA"],
  ["Test4", 20, "table", "Sample4", "NA"],
  ["Test5", 20, "table", "Sample5", "NA"]
];

const arr2 = [
  ["Test2", 20, "table", "Sample2", "NA"],
  ["Test4", 20, "table", "Sample4", "NA"],
  ["Test5", 20, "table", "Sample5", "NA"],
  ["Test6", 20, "table", "Sample6", "NA"],
  ["Test7", 20, "table", "Sample7", "NA"]
];

const set1 = new Set(arr1.map(JSON.stringify));
const set2 = new Set(arr2.map(JSON.stringify));

const unique1 = arr1.filter(subarr => !set2.has(JSON.stringify(subarr)));
const unique2 = arr2.filter(subarr => !set1.has(JSON.stringify(subarr)));

console.log(unique1);
console.log(unique2);

Я превращаю массивы в наборы, чтобы уменьшить сложность вычислений - Set#has равно O(1), но методы массива для тех же логик c равны O(n).

0 голосов
/ 12 февраля 2020

Используя приведенную ниже функцию commonElements (), вы можете получить желаемый результат.

arr1 = [
      ["Test1", 20, "table", "Sample1", "NA"],
      ["Test2", 20, "table", "Sample2", "NA"],
      ["Test3", 20, "table", "Sample3", "NA"],
      ["Test4", 20, "table", "Sample4", "NA"],
      ["Test5", 20, "table", "Sample5", "NA"]
    ];

    arr2 = [
      ["Test2", 20, "table", "Sample2", "NA"],
      ["Test4", 20, "table", "Sample4", "NA"],
      ["Test5", 20, "table", "Sample5", "NA"],
      ["Test6", 20, "table", "Sample6", "NA"],
      ["Test7", 20, "table", "Sample7", "NA"]
    ];

    function notcommonElements(arr1, arr2) {
        var obj = {}, matched = [],
            unmatched = [];
        for (var i = 0, l = arr1.length; i < l; i++) {
            obj[arr1[i]] = (obj[arr1[i]] || 0) + 1;
        }
        for (i = 0; i < arr2.length; i++) {
            var val = arr2[i];
            if (val in obj) {
                matched.push(val);
            } else {
                unmatched.push(val);
            }
        }
        console.log(unmatched);
    }

    notcommonElements(arr1, arr2);
    
0 голосов
/ 12 февраля 2020

Обновлено: чтобы получить уникальные элементы, go через оба массива и построить один объект и использовать Object.values для преобразования в массив массивов.

arr1 = [
  ["Test1", 20, "table", "Sample1", "NA"],
  ["Test2", 20, "table", "Sample2", "NA"],
  ["Test3", 20, "table", "Sample3", "NA"],
  ["Test4", 20, "table", "Sample4", "NA"],
  ["Test5", 20, "table", "Sample5", "NA"]
];

arr2 = [
  ["Test2", 20, "table", "Sample2", "NA"],
  ["Test4", 20, "table", "Sample4", "NA"],
  ["Test5", 20, "table", "Sample5", "NA"],
  ["Test6", 20, "table", "Sample6", "NA"],
  ["Test7", 20, "table", "Sample7", "NA"]
];



const assign = (array, obj) =>
  array.forEach(arr => Object.assign(obj, { [arr.join()]: arr }));

const res = {};
assign(arr1, res);
assign(arr2, res);

const unique = Object.values(res);

console.log(unique);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...