尝试删除出现在两个数组中的任何数字:
function diff(args) {
var diff = [].concat.apply([],arguments).reduce(
function(result, current) {
console.log("result: " + result);
console.log("current: " + current);
console.log("result.indexOf(current): " + result.indexOf(current));
return result.indexOf(current) === -1
? result.concat(current)
: result.splice(result.indexOf(current), 1);
}, []
);
console.log("diff: " + diff);
return diff;
}
console.clear();
diff([1, 2, 3], [5, 2, 1, 4]);
但是,控制台指示:
Console was cleared
result:
current: 1
result.indexOf(current): -1
result: 1
current: 2
result.indexOf(current): -1
result: 1,2
current: 3
result.indexOf(current): -1
result: 1,2,3
current: 5
result.indexOf(current): -1
result: 1,2,3,5
current: 2
result.indexOf(current): 1
result: 2
current: 1
result.indexOf(current): -1
result: 2,1
current: 4
result.indexOf(current): -1
diff: 2,1,4
为什么slice语句会被忽略,而将结果var重置为当前var?
理想情况下,我认为第一次发现时的result.splice(result.indexOf(current),1)将导致:
1,3,5
不
2
最佳答案
Array#splice
returns被删除的数组的切片,您正在将其分配给结果。
您应该使用Array#slice
代替:
function diff(args) {
var diff = [].concat.apply([], arguments).reduce(
function(result, current) {
console.log("result: " + result);
console.log("current: " + current);
console.log("result.indexOf(current): " + result.indexOf(current));
var index = result.indexOf(current);
return index === -1 ?
result.concat(current) :
result.slice(0, index).concat(result.slice(index + 1));
}, []
);
console.log("diff: " + diff);
return diff;
}
console.clear();
diff([1, 2, 3], [5, 2, 1, 4]);