2017-08-06 49 views
0

我在javaScript中編寫了一個函數,用於檢查它是否是第一次顯示數字,如果是,它將被添加到數組中。出於某種原因,第一個數字總是重複它,例如:將非重複數字添加到數組中

如果我們通過[1,1,1,2,3,3,4,5] 它會打印出[1,1,2,3 ,4,5]而不是[1,2,3,4,5]

有誰能告訴我我在想什麼? 預先感謝您。

var numbers = [1,1,1,1,1,2,3,4,4,4,5,5,6,6,6,8]; 
function eliminateDup(arr){ 

    var myArr = []; 

    for(var i = 0;i<arr.length;i++){ 

     if(!myArr[arr[i]]){ 

      myArr.push(arr[i]); 
     } 
    } 
    return myArr; 
} 
console.log(eliminateDup(numbers)); 
+1

爲什麼不使用'indexOf'代替這個混亂:'!myArr [arr [i]]' – Derek

+3

請注意,您可以使用'uniques = [... new Set(numbers)] ' – trincot

+0

這假設輸入按升序排序 – ASDFGerte

回答

0

利用這個條件來代替,用於推動

if(myArr.indexOf([arr[i])===-1) 
+0

非常感謝你們,作爲一個初學者,我有時會努力去調試我自己的代碼。它完全瞭解你們都向我解釋了什麼。再次感謝。 – cubila

1

這種比較是沒有意義的:

if(!myArr[arr[i]]){ 

true只有!myArr[arr[i]]可以轉換爲true
你的目標陣列myArr在獲得兩倍1因爲無論arr[0]arr[1]等於1myArr具有在1指數在其中執行條件語句時的兩個第一迭代的不確定因素。


第一次迭代

i = 0 
arr[0] = 1 
myArr[1] = undefined 

所以if(!myArr[1])true
您添加1

第二次迭代

i = 1  
arr[1] = 1 
myArr[0] = 1 // now valued but not used in the test 
myArr[1] = undefined; 

所以if(!myArr[1])true
您還在添加1

第三次迭代

i = 2 
arr[2] = 1 
myArr[0] = 1 
myArr[1] = 1 

所以if(!myArr[1])false
什麼都沒有添加。


你還是檢查當前值是否未包含目標數組中的目標數組中添加它之前:

if(myArr.indexOf(arr[i])==-1){ 
    myArr.push(arr[i]); 
} 
0

myArr.push(arr[i]);會推到陣列myArr(就像回堆棧),因此元素'1'將位於索引0.

myArr[arr[i]]檢查索引arr[i]上是否存在元素,它不會如此將推送另一個1

如上所述,使用indexof(),如果元素存在,它將只搜索並給出索引。