【问题标题】:splice() inside a for loop, what is the solution?splice() 在 for 循环中,解决方案是什么?
【发布时间】:2017-07-07 01:36:45
【问题描述】:

我正在尝试从这个名为“bigArray”的数组中删除重复项,同时保持数组的前三个位置不变(即使它们重复)。

我的问题是 for 循环内的 splice() 无法正常工作,因为每次拼接时,for 循环都会跳过数组的下一个位置(因为该位置是数组中较低的一个位置)。

如何让我的函数返回 [0,0,0,3,2] ?

谢谢

var bigArray = [0,0,0,3,2,2,3,3,2];

function call() { 

  
  for (let i=3; i < (bigArray.length); i++) {
    if (bigArray.indexOf(bigArray[i]) !== i) {
          bigArray.splice(i,1);
    
    }

    }
    
    console.log(bigArray);
    return bigArray; 
}
    
call();

【问题讨论】:

  • 所以你不应该修改原始数组..尝试使用 filter()
  • @guijob 可以修改原始数组,只将迭代改为向后

标签: javascript arrays


【解决方案1】:

您正在使用运行循环的 splice() 修改数组。您必须使用第二个数组来存储非重复值。你可以这样做:

var bigArray = [0,0,0,3,2,2,3,3,2];
var noDuplicates = bigArray.slice(0,3);
function call() { 

  
  for (let i=3; i < (bigArray.length); i++) {
    if (bigArray.indexOf(bigArray[i]) === i) {
          noDuplicates.push(bigArray[i]);
    
    }

    }
    
    console.log(noDuplicates);
    return noDuplicates; 
}
    
call();

【讨论】:

    【解决方案2】:

    另一种方法。

        function finddup(arr){
          var tmp = [];
          for(var i = 0; i < arr.length; i++){
             if(i<3)
             {
              tmp.push(arr[i]);
             }
            else
            if(tmp.indexOf(arr[i]) == -1)
             {
             tmp.push(arr[i]);
             }
         }
        return tmp; 
         }
    

    希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      如果您正在寻找功能性方法:

      var arr = [0,0,0,3,2,2,3,3,2];
      arr.filter((e,i,self) => i<3 ? true : self.findIndex(x=>x === e) === i)
      

      【讨论】:

        【解决方案4】:

        你应该减去 i。

        var bigArray = [0,0,0,3,2,2,3,3,2];
        
        function call() { 
        
          
          for (let i=3; i < (bigArray.length); i++) {
            if (bigArray.indexOf(bigArray[i]) !== i) {
                  bigArray.splice(i,1);
            			i--;
            }
        		
          }
            
            console.log(bigArray);
            return bigArray; 
        }
            
        call();

        【讨论】:

        • 哦...我没想过要做这么简单的事情!但是,为什么有人反对这个解决方案?
        • 好吧,我不知道@Emilio。但这很简单。我希望这可以帮助你。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 2018-04-02
        • 2017-04-27
        • 2013-12-27
        • 2021-12-23
        • 1970-01-01
        相关资源
        最近更新 更多