У .indexOf()
метода есть необязательный второй параметр, который указывает индекс, с которого нужно начать поиск, поэтому вы можете вызвать его в цикле, чтобы найти все экземпляры определенного значения:
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var indexes = getAllIndexes(Cars, "Nano");
Вы действительно не объясняете, как вы хотите использовать индексы, поэтому моя функция возвращает их как массив (или возвращает пустой массив, если значение не найдено), но вы можете сделать что-то еще с отдельными значениями индексов внутри петли.
ОБНОВЛЕНИЕ: согласно комментарию VisioN, простой цикл for позволит выполнить ту же работу более эффективно, и его легче понять и, следовательно, проще поддерживать:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
циклу с заполнением массива индексов..indexOf()
я хотел показать, что он может выполнять эту работу. (Думаю, я решил, что OP может понять, как это сделать с помощью цикла for.) Конечно, есть и другие способы сделать это, например,Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
вместоindices
: PДругое альтернативное решение - использовать
Array.prototype.reduce()
:NB: Проверьте совместимость браузера для
reduce
метода и использования polyfill при необходимости.источник
:)
Да, я подумал, чтоreduce
может быть хорошей альтернативой.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
медленнееpush
, поэтому придерживаюсь ответа.Другой подход с использованием Array.prototype.map () и Array.prototype.filter () :
источник
map(…)
проверяет на каждой итерации равенствоe
иvalue
. Когда они совпадают, возвращается индекс, в противном случае - пустая строка. Чтобы избавиться от этих ложных значений,filter(String)
убедитесь, что результат содержит только значения типа строки, а НЕ пустые.filter(String)
можно также записать как:filter(e => e !== '')
String(thing)
приводит что-либо к строке.Array#filter
возвращает массив всех значений, для которых условие является истинным . Поскольку пустые строки являются ложными , они НЕ включаются в массив.Более простой способ в стиле es6.
источник
Вы можете написать простое удобочитаемое решение, используя как
map
иfilter
:РЕДАКТИРОВАТЬ: Если вам не нужно поддерживать IE / Edge (или вы переносите код), ES2019 предоставил нам flatMap , который позволяет сделать это простым однострочником:
источник
Примечание. MDN предоставляет метод с использованием цикла while :
Я бы не сказал, что это лучше других ответов. Просто интересно.
источник
Я просто хочу обновиться другим простым способом.
Вы также можете использовать метод forEach.
источник
источник
Это сработало для меня:
источник
Чтобы поделиться другим методом, вы также можете использовать генераторы функций для достижения результата:
источник
Мы можем использовать Stack и вставлять "i" в стек каждый раз, когда мы встречаем условие "arr [i] == value"
Проверь это:
источник
javascript
, а ваш ответ - "Java
Я верю"?источник
Вы можете использовать Polyfill
}
Используйте это так:
источник
findIndex
извлекает только первый индекс, соответствующий выходным данным обратного вызова. Вы можете реализовать свой собственныйfindIndexes
, расширив Array, а затем преобразовав массивы в новую структуру.источник
Если вы собираетесь использовать подчеркивание / lodash, вы можете сделать
источник
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])