如何获得两个数组之间的差异?
How to get the difference between two arrays?
我有 2 个数组:
arr1 = [[11,12],[11,13],[11,14], [12,13]];
arr2 = [[11,13],[11,14]];
预期结果[[11,12],[12,13]]
.
如何获得两个数组之间的差异?我使用 lodash _.difference
但它给了我一个错误的答案。
你需要使用_.differenceWith()
,因为你需要比较子数组的元素。默认情况下,它只是测试子数组是否是相同的对象,而它们可能不是。
result = _.differenceWith(arr1, arr2, _.isEqual);
仅使用 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("], [")+"]]")
没有 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);
这个分离(联合)工作,几行纯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);
我有 2 个数组:
arr1 = [[11,12],[11,13],[11,14], [12,13]];
arr2 = [[11,13],[11,14]];
预期结果[[11,12],[12,13]]
.
如何获得两个数组之间的差异?我使用 lodash _.difference
但它给了我一个错误的答案。
你需要使用_.differenceWith()
,因为你需要比较子数组的元素。默认情况下,它只是测试子数组是否是相同的对象,而它们可能不是。
result = _.differenceWith(arr1, arr2, _.isEqual);
仅使用 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("], [")+"]]")
没有 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);
这个分离(联合)工作,几行纯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);