2013-06-26 36 views
3

我在数组中使用一组数值,其中某些值将被重复。我想找到指数ALL重复值的发生。如何获取数组中所有出现的相同值的索引?

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

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

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

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

回答

2

@Bagavatu:如果你不希望一个循环,你可以试试这个fiddle -

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; 
+0

感谢您的答案,但这仍然涉及'for'循环迭代。 –

+1

@Bagavatu - 抱歉,我错过了你的帖子。我认为你不能避免某种形式的迭代,因为你需要检查每个值单独匹配。即使你使用诸如“过滤器”之类的东西,它仍然会遍历每个条目,而不是明确的。 – Bungus

+0

是的,我担心会是这样。如果必须涉及迭代,我想找到一种方法来最小化迭代的开销。所以像'过滤器'。 (我的实际数据集长达数百个值;为简洁起见,我只是缩短了它。) –

1

这里有一个例子:Try if yourself

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); 
} 
+0

你能检查一下你的链接吗?我结束了一个404错误。 –

+0

@Bagavatu再试一次 – maqjav

+0

谢谢,我现在可以看到JSFiddle。然而,while循环仍然具有迭代的效果。我从来没有这样想过,所以非常感谢。 +1。 –

2

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

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

而且here is some more documentation on the filter() method,以及为老版本浏览器的回退。

1

看起来这个功能可能不是现成的,但是通过创建一个Array.prototype.allIndexOf函数,可以得到一个'插件'here

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

+1

谢谢!我喜欢它对IE的良好支持。 –

+0

@Bagavatu很高兴帮助! – Igor

相关问题