var a = [
[
{
id: "AAA"
},
{
id: "BBB"
}
],
[
{
id: "AAA"
},
{
id: "DDD"
}
]
];
var b = [
[
{
id: "BBB"
}
],
[
{
id: "CCC"
},
{
id: "BBB"
}
],
[
{
id: "AAA"
}
],
[
{
id: "AAA"
},
{
id: "DDD"
}
],
[
{
id: "DDD"
}
],
[
{
id: "CCC"
},
{
id: "DDD"
}
],
[
{
id: "AAA"
}
],
[
{
id: "AAA"
},
{
id: "BBB"
}
]
];
function remove_duplicates(a, b) {
for (var i = 0, len = a.length; i < len; i++) {
for (var j = 0, len = b.length; j < len; j++) {
if (a[i].name == b[j].name) {
b.splice(j, 1);
}
}
}
console.log(a);
console.log(b);
}
console.log(a);
console.log(b);
remove_duplicates(a,b);
我已经尝试了过滤器并减少但是它们会带来所需的结果 我找到了一个similar one,但是我得到了一个不同的结构
寻求JavaScript或下划线的可能解决方案
预期结果:[[{"id":"BBB"}],[{"id":"CCC"},{"id":"BBB"}],[{"id":"AAA"}],[{"id":"DDD"}],[{"id":"CCC"},{"id":"DDD"}]]
答案 0 :(得分:0)
首先我们需要知道两个数组何时相等。我在isEqual函数中定义了这个,如果数组长度相同,并且对象具有相同的id,则数组等于另一个数组。
接下来,我们需要了解“删除重复项”的含义。想象一下,如果你有两个数组。 [1,2,3,4]和[2,4,5,6]。我们期望结果为[1,3,5,6]。我们通过获取第一个数组并减去第二个数组中存在的任何项,然后获取第二个数组并减去第一个数组中存在的任何项来实现。最后,我们将两个结果结合在一起。这就是remove_duplicates函数中发生的事情。
var a = [
[
{
id: "AAA"
},
{
id: "BBB"
}
],
[
{
id: "AAA"
},
{
id: "DDD"
}
]
];
var b = [
[
{
id: "BBB"
}
],
[
{
id: "CCC"
},
{
id: "BBB"
}
],
[
{
id: "AAA"
}
],
[
{
id: "AAA"
},
{
id: "DDD"
}
],
[
{
id: "DDD"
}
],
[
{
id: "CCC"
},
{
id: "DDD"
}
],
[
{
id: "AAA"
}
],
[
{
id: "AAA"
},
{
id: "BBB"
}
]
];
function remove_duplicates(a, b) {
var setOfB = setOf(b);
var setOfA = setOf(a);
var aMinusB = minus(setOfA, setOfB);
var bMinusA = minus(setOfB, setOfA);
return aMinusB.concat(bMinusA);
}
function setOf(array){
return _.uniq(array, false, JSON.stringify);
}
function minus(a,b) {
return _.reject(b, function(item){
return _.find(a, _.partial(_.isEqual, item));
});
}
// var expected = [
// [{"id":"BBB"}],
// [{"id":"CCC"},{"id":"BBB"}],
// [{"id":"AAA"}],
// [{"id":"DDD"}],
// [{"id":"CCC"},{"id":"DDD"}]
// ];
console.log(remove_duplicates(a,b));