2013-07-25 3 views
1

Я просматривал веб-сайт, и все, что я нахожу, - это вопросы, связанные с поиском индекса значения в массиве, но это значение является единственным вхождением этого значения в массив. Мне было интересно, есть ли способ найти индекс повторяющейся ценности каждый раз, когда это происходит.Поиск индекса значения в массиве

Say есть и массив так:

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

Loops будет среди первых вещей, которые вы узнаете в основном учебнике по программированию. –

ответ

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()'? ... oops, нет, это не сработает. –

+0

@CrazyTrain: Как бы вы это сделали? Вам нужно каким-то образом отобразить индекс там, 'filter' ожидает, что вы вернете либо« true/thy », либо« false/y ». Я что-то упускаю? – elclanrs

+0

Только обновление моего комментария. Я не думал о показателях. –

1

Loop 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

Чтобы отформатировать код, просто выберите весь блок кода и нажмите кнопку ** '{}' ** над областью редактирования. –

Смежные вопросы