我正在尝试将多个数组压缩成一个并删除数组中的重复元素,以便从FCC进行练习。
具体来说,拼接方法在控制台中显示一件事但行为不同。谁能告诉我为什么splice()没有删除我用嵌套循环识别的重复项?
function uniteUnique(arr) {
var arr1 = arguments;
newArr= [];
for(var i=0; i<arr1.length; i++){
for(var l=0; l<arr1[i].length; l++){
newArr.push(arr1[i][l]);
}
}
console.log(newArr);
for(var t=0; t<newArr.length; t++){
for(var p=0; p<newArr.length; p++){
if(newArr[t]===newArr[p+1]){
console.log("without splice ", newArr[p+1]);
console.log("with splice ", newArr.splice(newArr[p+1],1))
newArr.splice(newArr[p+1],1);
}
}
}
return newArr;
}
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
将输出[4,1]。 但是应该输出[1,3,2,5,4]
第一次迭代日志: 没有拼接1 与splice [3]
第二 没有拼接1 与拼接[2]
第三 没有拼接2 与拼接[4]
第四: 没有拼接1 与拼接[2]
答案 0 :(得分:1)
这里有三个错误:
此处无需使用p+1
。只需使用p
。
splice
期望索引作为其第一个参数,但您将值视为要删除作为执行删除的索引。这没有意义。而不是.splice(newArr[p], 1)
,您需要.splice(p, 1)
。
您不会阻止某个值被视为潜在重复。如果if
等于... && p!=t
答案 1 :(得分:0)
不建议在其循环中修改数组。如果您不必使用splice,只需创建一个全新的数组并通过搜索推送值,如果不存在则。
function uniteUnique() {
var newArr = [];
for(var i=0; i<arguments.length; i++) {
var arr = arguments[i];
for(var j=0; j<arr.length; j++) {
if(newArr.indexOf(arr[j]) == -1) {
newArr.push(arr[j]);
}
}
}
return newArr;
}
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
答案 2 :(得分:0)
关于删除你的方法“就地”的重复项,splice工作正常并且你的算法几乎是好的,尝试在展平后调试迭代的每一步,以删除重复项。
你循环n平方次(因为p = t,你迭代p * t次)。 但是,有些东西没有做你想做的事情,看看这些:
if(newArr[t]===newArr[p+1]){ // HERE IT WON'T DO WHAT YOU WANT
除非你提到它,否则我不打算给出答案,我只是想证明问题不依赖于拼接本身,而不是你的算法。
您需要修改的另一行是
newArr.splice(newArr[p+1],1);
基本上,只要对这两行进行一些更改,您就可以达到删除重复项的目标。