简体   繁体   English

过滤数组的交集(Javascript)

[英]Filter intersection of arrays (Javascript)

I'm trying to write a function that finds arrays that are not common to both nested arrays. 我正在尝试编写一个函数来查找两个嵌套数组常见的数组。 Also note the arrays will be pre-sorted. 另请注意,阵列将进行预先排序。

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

For the above two arrays the function should return [5, 6, 7] and [7, 8, 9]. 对于上面两个数组,函数应该返回[5,6,7]和[7,8,9]。

So far I've got: 到目前为止我有:

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

But it doesn't seem to be working. 但它似乎没有奏效。 I'm guessing the indexOf() isn't doing a compares correctly. 我猜测indexOf()没有做正确的比较。 I'm trying to avoid using ES6 or polyfills. 我试图避免使用ES6或polyfill。

First, you referenced the wrong array in your filter. 首先,您在过滤器中引用了错误的数组。 To fix the comparison, you could turn the arrays to json. 要修复比较,可以将数组转换为json。 You will also need to run the filter against the second array and join the answers.: 您还需要针对第二个阵列运行过滤器并加入答案:

 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)); 

You can use the built in .every() and .filter() array methods to accomplish this task. 您可以使用内置的.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)); 

It's not a best option but it works 这不是最佳选择,但它有效

 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); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM