过滤数组的交集(Javascript)

时间:2017-04-25 21:41:48

标签: javascript arrays multidimensional-array

我正在尝试编写一个函数,找到两个嵌套数组共有的数组。另请注意,阵列将进行预先排序。

var array1 = [ [1, 2, 3], [2, 3, 4] [5, 6, 7] ];
var array2 = [ [1, 2, 3], [2, 3, 4] [7, 8, 9] ];

对于上面两个数组,函数应该返回[5,6,7]和[7,8,9]。

到目前为止,我已经:

        function arrayIntersection(array1, array2) {
            return array2.filter(function(values1) {
                return array2.indexOf(values1) === -1;
            });
        };

但它似乎没有起作用。我猜测indexOf()没有做正确的比较。我试图避免使用ES6或polyfills。

3 个答案:

答案 0 :(得分:0)

首先,您在过滤器中引用了错误的数组。要修复比较,可以将数组转换为json。您还需要针对第二个阵列运行过滤器并加入答案。:



var array1 = [ [1, 2, 3], [2, 3, 4], [5, 6, 7] ];
var array2 = [ [1, 2, 3], [2, 3, 4], [7, 8, 9] ];

function arrayIntersection(input1, input2) {
    var input2NotInInput1 = input2.filter(function(values1) {
        return input1.map(function(val) { return JSON.stringify(val); }).indexOf(JSON.stringify(values1)) === -1;
    });
    var input1NotInInput2 = input1.filter(function(values1) {
        return input2.map(function(val) { return JSON.stringify(val); }).indexOf(JSON.stringify(values1)) === -1;
    });
    return input1NotInInput2 .concat( input2NotInInput1 );
};

console.log(arrayIntersection(array1, array2));




答案 1 :(得分:0)

您可以使用内置的.every().filter()数组方法来完成此任务。

var array1 = [ [1, 2, 3], [2, 3, 4], [5, 6, 7] ];
var array2 = [ [1, 2, 3], [2, 3, 4], [7, 8, 9] ];

function compareArrays(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  } else {
    return arr1.every(function(elem) {
      return arr2.indexOf(elem) > -1;
    });
  }
}

function filterUnique(arr1, arr2) {
  return arr1.filter(function(elem) {
    return arr2.every(function(_elem) {
      return !compareArrays(_elem, elem);
    });
  });
}

function filterIntersection(arr1, arr2) {
  var uniqueToArr1 = filterUnique(arr1, arr2);
  var uniqueToArr2 = filterUnique(arr2, arr1);
  return [].concat(uniqueToArr1, uniqueToArr2);
}

console.log(filterIntersection(array1, array2));

答案 2 :(得分:0)

这不是最好的选择,但它有效

var ar1 = [
  [1, 2, 3],
  [2, 3, 4],
  [5, 6, 7]
];
var ar2 = [
  [1, 2, 3],
  [2, 3, 4],
  [7, 8, 9]
];

function arrayIntersection(array1, array2) {
  return array2.filter(function(values1) {
    return !array1.some(v => JSON.stringify(v) === JSON.stringify(values1));
  });
};

var result = arrayIntersection(ar1, ar2);
console.log(result);