2017-07-07 40 views
1

我試圖從數組中移除重複稱爲「bigArray」,同時保持數組的三個第一個位置不變(即使他們重複)。splice()在for循環中,解決方案是什麼?

我的問題是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();

+1

所以你不應該修改原始數組..嘗試使用的過濾器() – guijob

回答

0

你應該減去我。

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); 
 
    \t \t \t i--; 
 
    } 
 
\t \t 
 
    } 
 
    
 
    console.log(bigArray); 
 
    return bigArray; 
 
} 
 
    
 
call();
其他

+0

喔...我沒有想到這樣簡單的事情!但是,爲什麼有人低估了這個解決方案? – Emilio

+0

嗯,我不知道@Emilio。但這很簡單。我希望這可以幫助你。謝謝。 –

3

您正在使用拼接修改陣列()在其上運行的循環。您必須使用第二個數組來存儲不重複的值。你可以做這樣的事情:

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();

1

一種方式來做到這一點。

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; 
    } 

希望這對你有所幫助!

1

,如果你正在尋找一個功能的方法:

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) 
相關問題