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

Return all the array indexes of a given element

本文关键字:数组 索引 元素 返回      更新时间:2023-09-26

我写了下面的函数,对于给定的数组和值将返回数组中值的索引数组。我观察到它只对某些元素有效?

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]

问题你继续搜索,直到数组结束。如果你没有找到,返回[].

所以如果你搜索的值不是数组的最后一个元素你会得到[]

你应该把if改成:

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

让我们快速重写一下这个函数。这就是你所需要的:

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;
}

这可能不是最有效的,因为无论如何它都会迭代整个数组,但它工作起来很有魅力。

问题出在这一行:

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

你应该用:

if (pos == -1) break;

或:

if (pos == -1) return results;

方法如下。简单。并且不遍历整个数组。

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)