Я немного занимался серфингом, пытаясь найти эффективный способ сделать это, но ничего не получил. У меня есть массив объектов, который выглядит следующим образом:
array[i].id = some number;
array[i].name = some name;
То, что я хочу сделать, - это найти ИНДЕКСЫ объектов, где id равен, например, одному из 0,1,2,3 или 4. Я полагаю, я мог бы просто сделать что-то вроде:
var indexes = [];
for(i=0; i<array.length; i++) {
(array[i].id === 0) ? { indexes[0] = i }
(array[i].id === 1) ? { indexes[1] = i }
(array[i].id === 2) ? { indexes[2] = i }
(array[i].id === 3) ? { indexes[3] = i }
(array[i].id === 4) ? { indexes[4] = i }
}
Хотя это будет работать, оно выглядит довольно дорогим и медленным (не говоря уже об уродливости), особенно если array.length может быть большим. Любые идеи о том, как украсить это немного? Я думал об использовании array.indexOf как-то, но я не вижу, как заставить синтаксис. это
array.indexOf(this.id === 0);
например, возвращает undefined, как это должно быть. Заранее спасибо!
javascript
arrays
indexof
Петров
источник
источник
Array.prototype.findIndex()
в ECMAScript 2015 появился новый метод массива . Принятый ответ был потрясающим.Ответы:
Может быть, вы хотели бы использовать функции более высокого порядка, такие как «карта». Предполагая, что вам нужен поиск по атрибуту 'field':
источник
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. Это всего лишь подсказка:elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
очевидно, хеш-функция, которую я предоставляю, недействительна для всех случаев, поскольку'_'
может составлять часть ваших значений, но это лишь быстрый пример того, как можно найти различные методы хеширования.indexOf
возвращаемое значение, когда он не может найти данное значение.map, indexOf
вы можете использовать только один, называемыйfindIndex
....... Пример:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
Самый простой и легкий способ найти индекс элемента в массиве.
Синтаксис ES5:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
Синтаксис ES6:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
источник
findIndex
на сайте developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…obj.id == 3
используемый здесь оператор может вызвать неожиданное преобразование типа, поэтому используйтеobj.id === 3
вместо этого оператор, который проверяет одинаковое значение и тип.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
заняло 0,03500000002532033 миллисекунд. Использование[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
заняло 0,00999999747378752 миллисекунд.Новый метод Array .filter () будет хорошо работать для этого:
JQuery также может сделать это с помощью .grep ()
редактировать: стоит упомянуть, что обе эти функции просто повторяются под капотом, между ними не будет заметной разницы в производительности и использовании собственной функции фильтра, но зачем изобретать велосипед.
источник
Если вы заботитесь о производительности, не идет с находкой или фильтром или карты или любые из рассмотренных выше методов
Вот пример, демонстрирующий самый быстрый метод. ЗДЕСЬ ссылка на актуальный тест
Блок настройки
Самый быстрый метод
Более медленные методы
МЕДЛЕННЫЙ метод
источник
Результатом является список поиска для идентификатора. с заданным идентификатором мы получаем индекс записи.
источник
источник
Поскольку нет ответа с использованием обычного массива
find
:источник
Используя
map
функцию ES6 :источник
Новый способ использования ES6
источник
picked_element
это массив в этом случае ...const index = array.findIndex(item => item.id === 'your-id');
Это должно получить индекс предмета в массиве с id === your-id
источник
Похоже, вы могли бы создать простой итератор с обратным вызовом для тестирования. Вот так:
Тогда вы можете вызвать так:
источник
Приспосабливая ответ Tejs для mongoDB и Robomongo, я изменился
в
источник
Подводя итог всему большому ответу выше и дополнительному моему ответу относительно поиска всех индексов, произошел от некоторых комментариев.
источник
Поскольку я пока не могу комментировать, я хочу показать решение, которое я использовал, основываясь на методе, опубликованном Умаиром Ахмедом, но когда вы хотите найти ключ вместо значения:
Я понимаю, что он не отвечает на расширенный вопрос, но в заголовке не указывается, что нужно от каждого объекта, поэтому я хочу смиренно поделиться этим, чтобы в будущем избавиться от головной боли для других, хотя я отменяю, это может быть самое быстрое решение.
источник
Я создал крошечную утилиту под названием super-array, где вы можете получить доступ к элементам массива по уникальному идентификатору со сложностью O (1). Пример:
источник
вернет индекс 1 (работает только в ES 2016)
источник
Мне нравится этот метод, потому что его легко сравнить с любым значением объекта, независимо от того, насколько глубоко оно вложено.
источник