2013-07-25 146 views
1

我一直在瀏覽網站,我發現的所有問題都是關於查找數組中值的索引的問題,但該值是該數組中值的唯一出現次數。我想知道是否有一種方法可以在每次出現重複值時找到索引。查找數組中值的索引

說有和數組,像這樣:

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69]; 

是否可以遍歷這個並找到值69的指標?

+2

循環會首先您將學習基本的編程教程。 –

回答

2

當然這是可能的。電腦很棒。

var positions = []; 
for (var i = 0; i < arr.length; ++i) 
    if (arr[i] === 69) 
    positions.push(i); 

在循環結束時,數組「位置」將包含找到69的數組的所有索引。

你可以概括如下:

function indexes(arr, value) { 
    var rv = []; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] === value) 
     rv.push(i); 
    return rv; 
} 

然後:

var i69 = indexes(arr, 69); 
+1

第一行+1! –

3

這裏有一個辦法做到這一點在現代瀏覽器:

function findIndexes(arr, val){ 
    return arr.map(function(v,i){ return v==val && i }).filter(Number); 
} 

console.log(findIndexes(arr, 69)); //=> [9,22] 
+0

或者'.filter()'而不是'.map()'? ...哎呀,不,這不行。 –

+0

@瘋狂火車:你會怎麼做?您需要以某種方式映射索引,'filter'期望您返回'true/thy'或'false/y'。我錯過了什麼嗎? – elclanrs

+0

只有我的評論的更新。我沒有考慮指數。 –

1

循環while下一indexOf-1 ..

function allIndicesOf(arr, val) { 
    var found = [], i = -1; 
    while (-1 !== (i = arr.indexOf(val, i + 1))) found.push(i); 
    return found; 
} 

var arr = [0, 1, 2, 3, 2, 1, 8, 5, 2, 0, 4, 3, 3, 1]; 

allIndicesOf(arr, 3); // [3, 11, 12] 
+1

啊,我剛剛發佈了幾乎相同的例子。即使是在'while'頭部的任務。 +1 –

+1

@CrazyTrain當我一行'while'循環並且它按照期望工作時,我總覺得我已經取得了一些特殊的東西。 –

2

既然我們都張貼各種方式來完成簡單的任務...

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69]; 

arr.reduce(function(res, n, i) { 
    return n === 69 ? res.concat(i) : res; 
}, []); 
+0

+1創造力。我玩的是類似的智慧,但最終發佈了「map | filter」解決方案。 – elclanrs

+0

我唯一不喜歡的就是常量'.concat()'。讓我感到骯髒。雖然看起來確實比「if」陳述更好。 –

+0

你可以使用_reduce_,_charCodeAt_和_Array_在[這個問題]中做一些簡潔的事情(http://stackoverflow.com/questions/17845584/converting-a-random-string-into-a-hex-colour ),這不會像我在那裏的答案那樣瘋狂。 –

0

我的想法

function indexs(arr,val){ 
    var start = arr.indexOf(val),result = []; 
    while(start >= 0){ 
     result.push(start); 
     start = arr.indexOf(val,start+1); 
    } 
    return result; 
} 

玩得開心:)

0

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69], 
    i = arr.length, 
    o = {}; 

while(i--) { 
    if(!o[ arr[i] ]) { 
     `o[ arr[i] ] = [];` 
    } 
    o[ arr[i] ].push(i); 
} 

alert(o[69]); 
+0

要格式化您的代碼,只需選擇整個代碼塊,然後單擊編輯區域上方的**按鈕。{} –