我一直在编写代码,以便在一个或多个数组之间产生对称差异。如您所知,对称差异是排除两组数据中的元素。更多信息:https://en.wikipedia.org/wiki/Symmetric_difference
这是我的代码:
//This function drops any repeated element from a vector
function unify(arr){
var result=arr.reduce(function(vector,num,index,self){
var len=self.filter(function (val){
return val===num;
}).length;
if (len>1){
var pos=self.indexOf(num);
self.splice(pos,1);
}
vector=self;
return vector;
},[]);
return result;
}
function sym(args) {
var arg = Array.prototype.slice.call(arguments);
var compact= arg.map(function(vector){
return unify(vector);
});
//We compare the vectors and delete any repeated element before we concat them
return compact.reduce(function(prev,next,index,self){
for (var key in next) {
var entry=next[key];
var pos=prev.indexOf(entry);
if (pos!==-1){
prev.splice(pos,1);
next.splice(key,1);
}
}
return prev.concat(next);
});
}
console.log(sym([1, 2, 3], [5, 2, 1, 4]));

我不明白我做错了什么。我希望得到[3,4,5]
的结果,但这不是我得到的结果。
答案 0 :(得分:1)
进行拼接时,会更改数组的索引。所以它会跳过一些值。
在您的示例中,prev = [1,2,3]
和next = [5,2,1,4]
。
第一次拼接@ key = 1
后,两个数组看起来都像prev = [1,3]
和next = [5,1,4]
。下一个键是2,它会跳过1
中的条目next
。由于拼接,该索引已向左移动一个。
我的解决方案(抱歉,我正在通过手机,否则我会编写代码)
for
a in b
- 类型循环,请考虑重复但不变
next
数组