2016-07-22 39 views
-1

我正在創建座標平面三個連續遊戲,所以我必須找出數組中是否有三個相同值的數字但是沒有排序數組,因爲該數組表示在遊戲過程中添加到座標平面上的點的x座標... 例如,假設我已將6個點添加到座標平面並且x座標存儲在下一個數組中:JS查找數組中重複值的索引,如果有兩個以上重複的數據

var arr = [2,2,3,2,7,3]; 

我所需要的循環,因爲數字2發生在陣列3次,將只計算值2的出現,所以輸出應該是一個新的數組(稱爲指數例如陣列)與所述精確索引NMB 2次出現在ARR ...的

indices = [0,1,3] 

環路應該THEREFOR「復位」時,涉及到ARR的端部,如果某個值的出現的次數小於3 ...

我已經嘗試了下一個代碼,但它不起作用,就像我之前所描述的那樣,因爲它計算了數字3的出現次數,所以,如果數值較少,它不會「重置」超過2 ...

var arr = [2,2,3,2,7,3]; 
var index = []; 
var count = 0; 
var current; 
for(var i = 0;i<arr.length;i++){ 
    current = arr[i]; 
    //------------------------------- 
    for(var j=i+1;j<arr.length;j++){ 
     if(arr[j]===current){ 
      count++; 
      index.push(j); 
      //+++++++++++ 
      if(j===arr.length-1){ 
       if(count<2){ 
        count = 0; 
        index = []; 
        i++; 
       } 
       else{ 
        index.unshift(i); 
        break; 
       } 
      } 
      //+++++++++++ 
     } 
    } 
    //------------------------------- 
} 
alert(index); 

感謝任何幫助或建議...

亞歷山德拉

回答

0

是,使用一些邏輯...

var arr = [2, 2, 3, 2, 7, 3]; 
 

 
function showDupPos(arr, mindups) { 
 
    mindups = mindups || 2; 
 
    var result = []; 
 
    var positions = {}; 
 
    // collect all positions 
 
    arr.forEach(function(value, pos) { 
 
    positions[value] = positions[value] || []; 
 
    positions[value].push(pos); 
 
    }); 
 
    //check how much of same value in string 
 
    Object.keys(positions).forEach(function(value) { 
 
    var posArray = positions[value]; 
 
    if (posArray.length > mindups) { 
 
     result = result.concat(posArray); 
 
    } 
 
    }); 
 
    return result.sort(); 
 
} 
 
console.log(showDupPos(arr));

+0

zb'我剛剛運行代碼片段,它完美的工作!不幸的是,我從來沒有在這裏發佈,所以我不知道如何喜歡你的答案或類似的東西... – Alex

+0

只是大拇指和打勾的標記,附近的櫃檯 –

+0

我真的很愚蠢,我不小心點擊了箭頭除了你的回答,現在除了我的帖子還有-1以上,正如我之前提到我從未在這裏發佈過的,現在我不知道如何撤消這個動作?之後,我多次點擊了箭頭,但沒有發生任何事情......對不起... – Alex

0

this is my solution

var arr = [2,2,3,2,7,3]; 

var dictionary = {}; 
for(var i=0;i<arr.length;i++){ 
    if(dictionary[arr[i]]){ 
    dictionary[arr[i]]++; 
    }else{ 
    dictionary[arr[i]] = 1; 
    } 
} 

for(var num in dictionary){ 
    if(dictionary[num] == 3){ 
    alert(num); 
    } 
} 
+0

感謝您的建議!我已經用key => value數組嘗試了自己,輸出是出現次數,但是我需要原始數組中出現的索引... – Alex

4

我會做這樣的方式


 
var arr = [2,2,3,2,7,3]; 
 

 
var indices = []; 
 

 
arr.filter(function(yourArray, index) { 
 
if(yourArray == 2){ 
 
    indices.push(index) 
 
} 
 
}); 
 
console.log(indices)
如果打印索引它將包含這個輸出 [0,1,3]

,如果你想查詢有超過兩個副本你可以這樣做


 

 
var arr = [2,2,3,2,7,3]; 
 
var counts = arr.filter(function(yourArr,index, self){ 
 
    return !self.indexOf(yourArr) 
 
}); 
 

 
var indices = []; 
 

 
arr.filter(function(yourArr, index, self){ 
 
    if(yourArr == 2 && counts.length > 2){ 
 
    indices.push(index) 
 
} 
 
}) 
 
console.log(indices)

+0

我不認爲OP需要檢查2,我認爲'var arr = [2,2,3,2,7,3,3];'它應該是'[0,1,2,3 ,5,6]' –

+0

感謝您的努力和建議,但正如以前的評論,我不需要循環只爲一個特定的值/數量,但我需要通過數組循環,如果某個(不是預定義的)值發生3或者超過3次,輸出數組應包含原始數組中該值的出現次數... – Alex

+0

這就是它的工作原理。你可以將代碼包裝到函數中,並提供你想要的任何值。 –