5

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

例如,我使用以下代码indexOf()

var dataset = [2,2,4,2,6,4,7,8];
return dataset.indexOf(2);

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

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

4

4 回答 4

3

@Bagavatu:如果你不想要一个 for 循环,你可以试试这个小提琴-

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;

注意:使用 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;
于 2013-06-26T05:50:28.127 回答
2

您可以使用对象的filter()方法Array很好地处理:

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

这里还有一些关于 filter() 方法的文档,以及旧浏览器的后备。

于 2013-06-26T05:52:56.570 回答
1

这里有一个例子:如果你自己试试

var dataset = [2,2,4,2,6,4,7,8];

// We get the first indexOf number 2
var prev = dataset.indexOf(2);

// While we find indexes we keep searching
while (prev != -1) { 
    alert(prev);
    // we get the indexOf number 2 starting in the previous position + 1
    prev = dataset.indexOf(2, prev + 1);
}
于 2013-06-26T05:48:10.007 回答
1

看起来这个功能可能无法开箱即用,但这里有一个“插件”,可以通过创建一个Array.prototype.allIndexOf函数来使用。

它仍然遍历整个列表(这是必需的),但它稍微抽象了逻辑。

于 2013-06-26T05:53:58.757 回答