2014-07-02 19 views
0

我寫了下面的函數,它對給定的數組和值將返回數組中的值的索引數組。 我觀察到它僅適用於某些元素?返回給定元素的所有數組索引

var arr = [1,2,3,1,2,3,3,4,3] 

var findAll = function(arr, val) { 
    var results = []; 
    var length = arr.length; 
    var pos = 0; 
    while(pos < length) { 
     pos = arr.indexOf(val, pos); 
     if (pos == -1) return []; 
     results.push(pos); 
     pos = pos + 1; 
    } 
    return results; 
} 

//Output: 

findAll(arr,3) 
[2, 5, 6, 8] 

findAll(arr,1) 
[] // expected [0,3] 

findAll(arr,2) 
[] // expected [1,4] 

findAll(arr,4) 
[] // expected [7] 

回答

0

的問題是這一行:

if (pos == -1) break; 

或可能:

if (pos == -1) return []; 

你應該將其替換爲

if (pos == -1) return results; 
1

讓我們給功能快速重寫。這就是你需要:

var findAll = function(arr, val) { 
    var results = []; 
    for(var i = 0; i < arr.length; i++){ // Loop through the array. 
     if(arr[i] === val){    // If the desired value is found 
      results.push(i);    // Push it's index to `results` 
     } 
    } 
    return results; 
} 

它可能不是最有效的,因爲它遍歷整個數組不管是什麼,但它的工作原理就像一個魅力。

+0

我需要使用「的indexOf」方法按我的任務:) –

+0

嗯,這是一個愚蠢的分配由xD任何方式,在這種情況下,@ GZ的【答案】來實現這一( http://stackoverflow.com/a/24526042/1835379)可能最能解釋什麼是錯的。 – Cerbrus

2

你一直在搜索直到數組結尾的問題。如果你沒有找到你返回的東西[]。

所以如果你搜索的值不是最後一個元素的數組,你會得到[]

你應該改變你如果到:

if (pos != -1) results.push(pos); 
0

這是如何做到這一點。 簡單。並不遍歷整個數組。

function check(ar, val){ 
    var pos = 0; 
    var tmp = []; 
    pos = ar.indexOf(val, pos); 
    while (pos >= 0){ 
     tmp.push(pos); 
     pos = ar.indexOf(val, pos + 1); 
    } 
return tmp; 

http://jsfiddle.net/daqdm/1