2014-07-02 22 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