所以我得到了这个函数,我想删除所有重复项,但是 .splice() 方法没有按预期运行,有什么想法吗?
const removeDuplicateds = (arr)=>{
for (let i=0; i <arr.length ; i++){
for (let j=i+1; j<arr.length; j++){
if (arr[i]=== arr[j]){
arr.splice(j,1);
}
}
}
return console.log(arr);
}
removeDuplicateds([1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);
结果:(7) [1, 2, 3, 4, 1, 1, 1]
有 14 个 1,应该删除 13 个,但剩下 3 个,我不知道为什么
谢谢!
ps:我知道有更简单的方法可以做“消除重复”的事情(从 EM6 过滤或减少),但我是新手,想知道嵌套 for 是如何工作的(可能不是最好的练习)< /p>
答案 0 :(得分:3)
把它想象成一堆书。你从中间取出一本书,它上面的书向下移动。所以你的手指在第 5 本书上,第 6 本书现在是第 5 本书。你一直盯着新的第五本书,但你没有看。然后你看下一本书(第 6 本书),它最初是这堆书的第 7 本书。因此,如果“新的第 5 本书”本应该被删除,那么您可以忽略它。
每次删除一个项目时,数组中的下一个项目向下移动一个以填补该空白。由于您已经检查了该位置,因此您可以忽略它并继续前进。因此,当您删除它时,您需要将其移回。
const removeDuplicateds = (arr) => {
for (let i=0; i <arr.length ; i++){
for (let j=i+1; j<arr.length; j++){
if (arr[i]=== arr[j]){
arr.splice(j,1);
j--;
}
}
}
return arr;
}
console.log(removeDuplicateds([1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1]));
大多数人使用这种 2 循环方法解决问题的方法是按相反的顺序进行第二次循环。
const removeDuplicateds = (arr) => {
for (let i=0; i <arr.length ; i++){
for (let j = arr.length - 1; j > i; j--){
if (arr[i]=== arr[j]){
arr.splice(j,1);
}
}
}
return arr;
}
console.log(removeDuplicateds([1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1]));
大多数人会怎么做来对数组进行重复数据删除
const removeDuplicateds = (arr) => {
return [...new Set(arr)];
};
console.log(removeDuplicateds([1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1]))
答案 1 :(得分:2)
每次使用 .length
时数组 .splice
都会更改,因此您的内部循环不会迭代正确的次数。您可以在最后一个索引处开始外循环,然后向后工作以避免此问题,或者简单地使用 array.filter()
过滤掉重复项。
const removeDuplicateds = (arr)=>{
for (let i=arr.length-1;i>-1 ; i--){
for (let j=i-1; j>-1; j--){
if (arr[i]=== arr[j]){
arr.splice(j,1);
}
}
}
console.log(arr);
}
removeDuplicateds([1,2,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);