Javascript 如何获取数组中相同值的所有事件的索引?

Javascript 如何获取数组中相同值的所有事件的索引?,javascript,arrays,indexof,Javascript,Arrays,Indexof,我在一个数组中使用一组数值,其中某些值是重复的。我想找到重复值出现的所有的索引 例如,我使用indexOf()编写了以下代码: 但这只给出了第一次出现的2的索引。(即返回值0) 但是,我希望返回所有出现的2的索引(即0,1,3)。我该怎么做?(我知道我可以对循环使用,但我想知道是否有更好的方法在不迭代整个数组的情况下实现这一点。基本上,我试图节省显式迭代整个数组的开销。)这里有一个示例: @巴加瓦图:如果你不想要for循环,你可以试试这个- 注意:使用for循环会快得多。见评论 var data

我在一个数组中使用一组数值,其中某些值是重复的。我想找到重复值出现的所有的索引

例如,我使用
indexOf()
编写了以下代码:

但这只给出了第一次出现的
2
的索引。(即返回值
0


但是,我希望返回所有出现的
2
的索引(即
0,1,3
)。我该怎么做?(我知道我可以对循环使用
,但我想知道是否有更好的方法在不迭代整个数组的情况下实现这一点。基本上,我试图节省显式迭代整个数组的开销。)

这里有一个示例:


@巴加瓦图:如果你不想要for循环,你可以试试这个-

注意:使用for循环会快得多。见评论

var dataset = [2,2,4,2,6,4,7,8];
var results = [];
for ( i=0; i < dataset.length; i++ ){
    if ( dataset[i] == 2 ){
        results.push( i );
    }
}

return results;
var数据集=[2,2,4,2,6,4,7,8];
var结果=[];
对于(i=0;i
您可以使用
数组
对象的
过滤器()

var dataset = [2, 2, 4, 2, 6, 4, 7, 8];
var indexs = [];
dataset.filter(function(elem, index, array){
    if(elem == 2) {
        indexs.push(index);
    }
});
alert(indexs);

而且,对于较旧的浏览器也是一种回退。

看起来这项功能可能不可能是现成的,但是通过创建
数组.prototype.allIndexOf
函数,有一个“插件”可用


它仍然会遍历整个列表(这是必需的),但它会对逻辑进行一点抽象。

请检查您的链接好吗?最后出现了404错误。谢谢,我现在可以看到JSFIDLE了。但是,
while
循环仍然具有迭代的效果。我从来没有这样想过,所以谢谢你+1.谢谢你的回答,但这仍然涉及循环迭代。@Bagavatu-对不起,我错过了你的帖子。我认为您无法避免某种迭代,因为您需要逐个检查每个值是否匹配。即使你使用类似“过滤器”的东西,它仍然会在每个条目上迭代,只是没有显式地。是的,我担心会是这样。如果必须涉及迭代,我想找到一种方法来最小化迭代的开销。比如说
过滤器
。(我的实际数据集有上百个值;为了简洁起见,我只是缩短了它。)@Bagavatu——在对for循环和过滤器进行了基准测试后,for循环似乎更快了5到6倍。真的看到这把小提琴了吗?我从来不知道。这真是太好了!但是在你的回答中,如果有一种方法可以不用拼接就能做到这一点?我想保留原始数组。
var dataset = [2,2,4,2,6,4,7,8];
var results = [];

var ind

// the while loop stops when there are no more found
while( ( ind = dataset.indexOf( 2 ) ) != -1 ){
    results.push( ind + results.length )
    dataset.splice( ind, 1 )
}

return results;
var dataset = [2,2,4,2,6,4,7,8];
var results = [];
for ( i=0; i < dataset.length; i++ ){
    if ( dataset[i] == 2 ){
        results.push( i );
    }
}

return results;
var dataset = [2, 2, 4, 2, 6, 4, 7, 8];
var indexs = [];
dataset.filter(function(elem, index, array){
    if(elem == 2) {
        indexs.push(index);
    }
});
alert(indexs);