切片方法不删除所有重复项

时间:2021-07-27 19:50:52

标签: javascript

所以我得到了这个函数,我想删除所有重复项,但是 .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>

2 个答案:

答案 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]);