返回给定元素的所有数组索引

时间:2014-07-02 08:04:00

标签: javascript arrays

我编写了下面的函数,它在给定的数组和值上将返回数组中值的索引数组。 我发现它只适用于某些元素?

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]

4 个答案:

答案 0 :(得分:2)

你一直在搜索直到数组结尾的问题。如果你找不到东西,你会回来[]。

因此,如果您搜索的值不是数组中的最后一个元素,那么您将获得[]

你应该将你的if改为:

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

答案 1 :(得分: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;
}

它可能不是最有效的,因为它无论如何都会迭代整个阵列,但它就像一个魅力。

答案 2 :(得分:0)

问题在于这一行:

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

您应该将其替换为:

if (pos == -1) break;

或可能:

if (pos == -1) return results;

答案 3 :(得分: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