2013-07-25 109 views
1

我一直在浏览网站,我发现的所有问题都是关于查找数组中值的索引的问题,但该值是该数组中值的唯一出现次数。我想知道是否有一种方法可以在每次出现重复值时找到索引。查找数组中值的索引

说有和数组,像这样:

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69]; 

是否可以遍历这个并找到值69的指标?

+2

循环会首先您将学习基本的编程教程。 –

回答

2

当然这是可能的。电脑很棒。

var positions = []; 
for (var i = 0; i < arr.length; ++i) 
    if (arr[i] === 69) 
    positions.push(i); 

在循环结束时,数组“位置”将包含找到69的数组的所有索引。

你可以概括如下:

function indexes(arr, value) { 
    var rv = []; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] === value) 
     rv.push(i); 
    return rv; 
} 

然后:

var i69 = indexes(arr, 69); 
+1

第一行+1! –

3

这里有一个办法做到这一点在现代浏览器:

function findIndexes(arr, val){ 
    return arr.map(function(v,i){ return v==val && i }).filter(Number); 
} 

console.log(findIndexes(arr, 69)); //=> [9,22] 
+0

或者'.filter()'而不是'.map()'? ...哎呀,不,这不行。 –

+0

@疯狂火车:你会怎么做?您需要以某种方式映射索引,'filter'期望您返回'true/thy'或'false/y'。我错过了什么吗? – elclanrs

+0

只有我的评论的更新。我没有考虑指数。 –

1

循环while下一indexOf-1 ..

function allIndicesOf(arr, val) { 
    var found = [], i = -1; 
    while (-1 !== (i = arr.indexOf(val, i + 1))) found.push(i); 
    return found; 
} 

var arr = [0, 1, 2, 3, 2, 1, 8, 5, 2, 0, 4, 3, 3, 1]; 

allIndicesOf(arr, 3); // [3, 11, 12] 
+1

啊,我刚刚发布了几乎相同的例子。即使是在'while'头部的任务。 +1 –

+1

@CrazyTrain当我一行'while'循环并且它按照期望工作时,我总觉得我已经取得了一些特殊的东西。 –

2

既然我们都张贴各种方式来完成简单的任务...

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69]; 

arr.reduce(function(res, n, i) { 
    return n === 69 ? res.concat(i) : res; 
}, []); 
+0

+1创造力。我玩的是类似的智慧,但最终发布了“map | filter”解决方案。 – elclanrs

+0

我唯一不喜欢的就是常量'.concat()'。让我感到肮脏。虽然看起来确实比“if”陈述更好。 –

+0

你可以使用_reduce_,_charCodeAt_和_Array_在[这个问题]中做一些简洁的事情(http://stackoverflow.com/questions/17845584/converting-a-random-string-into-a-hex-colour ),这不会像我在那里的答案那样疯狂。 –

0

我的想法

function indexs(arr,val){ 
    var start = arr.indexOf(val),result = []; 
    while(start >= 0){ 
     result.push(start); 
     start = arr.indexOf(val,start+1); 
    } 
    return result; 
} 

玩得开心:)

0

var arr = [45,56,76,4,53,43,6,273,884,69,47,58,225,222,23,13,89,900,7,66,78,74,69], 
    i = arr.length, 
    o = {}; 

while(i--) { 
    if(!o[ arr[i] ]) { 
     `o[ arr[i] ] = [];` 
    } 
    o[ arr[i] ].push(i); 
} 

alert(o[69]); 
+0

要格式化您的代码,只需选择整个代码块,然后单击编辑区域上方的**按钮。{} –