我编写了下面的函数,它在给定的数组和值上将返回数组中值的索引数组。 我发现它只适用于某些元素?
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 :(得分: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;