如何区分两个数组?

时间:2017-01-01 10:10:41

标签: javascript arrays lodash array-difference

我有2个阵列:

arr1 = [[11,12],[11,13],[11,14], [12,13]];
arr2 = [[11,13],[11,14]];

预期结果[[11,12],[12,13]]

如何获得两个数组之间的差异?我使用lodash _.difference但它给了我一个错误的答案。

4 个答案:

答案 0 :(得分:4)

您需要使用_.differenceWith(),因为您需要比较子数组的元素。默认情况下,它只是测试子数组是否是相同的对象,它们可能不是。

result = _.differenceWith(arr1, arr2, _.isEqual);

答案 1 :(得分:0)

仅使用javascript,仅适用于此类似示例

var a1 = [[11,12],[11,13],[11,14], [12,13]];
var a2 = [[11,13],[14,11]];
var a3 = a1.filter(ar1 => !a2.some(ar2 => ar1.every(n1 => ar2.includes(n1))))
console.log(a3); // [[11,12],[12,13]]

创建通用解决方案的标准太多。

例如,[11,12]与[12,11]相同,可能只对同一数组的引用相同,(ar1 === ar2)true。如果同一个阵列中有两个相同的条目而另一个中有一个相同的条目,你会过滤掉一个,还是保留它?问题的数量可以持续一段时间,嵌套越深,阵列中存储的类型数越多,问题就越严重。



var a1 = [[11,12],[11,13],[11,14], [12,13]]
var a2 = [[11,13],[14,11],[12,14]];
a3 = [];
[[a1,a2],[a2,a1]].forEach(a=>{
    a3.push(...a[0].filter(
        ar1 => !a[1].some(
            ar2 => ar1.every(
                n1 => ar2.includes(n1)
            )
        )
    ))
});
console.log("[["+a3.join("], [")+"]]")




答案 2 :(得分:0)

你可以在没有lodash的情况下做到这一点。提示应该将子数组映射到字符串中以便于比较

var arr1 = [[11,12],[11,13],[11,14], [12,13]];
var arr2 = [[11,13],[11,14],[12,14]];

var res = arr1.concat(arr2).map(x => x.join(",")).filter((x,i,arr) => arr.indexOf(x) === arr.lastIndexOf(x)).map(x => x.split(","));

console.log(res);

答案 3 :(得分:0)

只需几行纯JS即可完成这种分离(联合工作)。此外,你应该确保检查两个阵列。



var arr1 = [[11,12],[11,13],[11,14],[12,13]],
    arr2 = [[11,13],[11,14],[12,14]];
     res = arr1.reduceRight((p,c,i,a) => { var fi = p.findIndex(s => c.every(n => s.includes(n)));
                                           return fi !== -1 ? (a.splice(i,1),
                                                               p.splice(fi,1),
                                                               p)
                                                            :  p;
                                         },arr2)
               .concat(arr1);
console.log(res);