2017-04-25 56 views
1

我正在尝试编写一个函数,用于查找嵌套数组通用的而不是的数组。还要注意数组将被预先排序。数组的过滤器交集(Javascript)

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。

+1

为什么岂不也返回'[5,6,7]'? – mhodges

+1

另外,命令重要吗?是[5,6,7]'与[7,6,5]'相同吗? – mhodges

+0

同意@mhodges,是否重要?或者将值总是排序? –

回答

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

+1

完美工作。谢谢! – poolts

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

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