Какой лучший способ получить индекс массива, который содержит объекты?
Представьте себе этот сценарий:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Теперь я хотел бы иметь indexOf
объект, hello
свойство 'stevie'
которого в данном примере будет 1
.
Я довольно новичок в JavaScript, и я не знаю, есть ли простой метод или мне нужно создать собственную функцию для этого.
javascript
Антонио Лагуна
источник
источник
hello
иqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[ссылка] ( stackoverflow.com/a/16100446/1937255 )Ответы:
Я думаю, что вы можете решить это в одну строку, используя функцию карты :
источник
Array.prototype.map()
Array.prototype.findIndex поддерживается во всех браузерах, кроме IE (без края). Но предоставленный polyfill хорош.
Решение с картой в порядке. Но вы перебираете весь массив при каждом поиске. Это только наихудший случай для findIndex, который останавливает итерацию, как только найдено совпадение.
Там не очень краткий способ(когда разработчики должны были беспокоиться о IE8) , но вот общее решение:или как функция:
Просто некоторые заметки:
Например,
источник
В ES2015 это довольно просто:
или, возможно, с лучшей производительностью для больших массивов:
источник
источник
Мне нравится ответ Пабло, но Array # indexOf и Array # map не работают во всех браузерах. Underscore будет использовать нативный код, если он доступен, но также имеет и запасные варианты. Кроме того, у него есть метод «отрывки» для того, чтобы делать именно то, что делает метод анонимной карты Пабло.
источник
chain
здесь лишнее._.pluck(myArray, 'hello').indexOf('stevie')
Или прототип это:
источник
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. Это потому, что это несколько типов, которые являются неизменными. Я также добавил бы третий аргумент, чтобы включить откат к нативному методу, если это необходимо.краткое
Случаи использования :
API:
источник
Я провел тестирование производительности различных ответов, которые каждый может запустить самостоятельно:
https://jsperf.com/find-index-of-object-in-array-by-contents
Исходя из моих начальных тестов в Chrome, следующий метод (с использованием цикла for, настроенного внутри прототипа) является самым быстрым:
Этот код является слегка измененной версией ответа Натана Заетты.
В тестах производительности я попробовал это сделать с целью, находящейся в середине (индекс 500) и в самом конце (индекс 999) массива объектов 1000, и даже если бы я поместил цель как самый последний элемент в массиве (т.е. что он должен пройти через каждый элемент массива, прежде чем он будет найден), он все равно оказывается самым быстрым.
Это решение также имеет преимущество в том, что оно является одним из самых кратких для многократного выполнения, поскольку нужно повторять только последнюю строку:
источник
while
цикла вместоfor
одного, иperformance.now()
. Я бы хотел, чтобы за этот ответ проголосовали больше, и чтобы я видел его раньше, он бы спас меня некоторое время ...Я сравнил несколько методов и получил результат с самым быстрым способом решения этой проблемы. Это
for
петля. Это в 5 раз быстрее, чем любой другой метод.Вот страница теста: https://jsbench.me/9hjewv6a98
источник
for-of
петля нет?Хотя большинство других ответов здесь действительны. Иногда лучше просто сделать короткую простую функцию рядом с местом, где вы будете ее использовать.
Это зависит от того, что важно для вас. Это может сэкономить строки кода и быть очень умным, чтобы использовать однострочник, или поместить универсальное решение где-нибудь, которое покрывает различные крайние случаи. Но иногда лучше просто сказать: «вот так я это сделал», чем оставлять будущим разработчикам дополнительную работу по реинжинирингу. Особенно, если вы считаете себя «новичком», как в вашем вопросе.
источник
Вид
[0]
.Уместно использовать
reduce
как вAntonio Laguna
ответе.Извиняюсь за краткость ...
источник
Если ваш объект - это тот же объект, который вы используете в массиве, вы сможете получить индекс объекта так же, как если бы это была строка.
источник
Попробуй это:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
источник
просто:
источник
Если вы заинтересованы только в поиске позиции, смотрите ответ @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Однако, если вы хотите найти элемент (то есть, если вы думаете о том, чтобы сделать что-то подобное
myArray[pos]
), есть более эффективный способ сделать это в одну строку , используяfilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Посмотреть результаты производительности (~ + 42% операций в секунду): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
источник
Смотрите этот пример: http://jsfiddle.net/89C54/
Начинает считать с нуля.
источник
Я сделал общую функцию, чтобы проверить ниже код и работает для любого объекта
Первое оповещение вернет -1 (означает, что совпадение не найдено), а второе оповещение вернет 0 (значит совпадение найдено).
источник
Использовать
_.findIndex
из библиотеки underscore.jsВот пример
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
источник
Используя
findIndex
метод ES6 , без lodash или каких-либо других библиотек, вы можете написать:Это сравнит непосредственные свойства объекта, но не вернется в свойства.
Если ваша реализация еще не предоставляет
findIndex
(большинство не предоставляют), вы можете добавить легкий полифил, который поддерживает этот поиск:(из моего ответа на этот обман )
источник
Вы можете использовать встроенную и удобную функцию в
Array.prototype.findIndex()
основном:Просто обратите внимание, что он не поддерживается в Internet Explorer, Opera и Safari, но вы можете использовать Polyfill, предоставленный по ссылке ниже.
Больше информации:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
источник
Furthor @Monika Garg ответ , вы можете использовать
findIndex()
(есть полифилл для unsupprted браузеров).Я видел, что люди отвергли этот ответ, и я надеюсь, что они сделали это из-за неправильного синтаксиса, потому что, на мой взгляд, это самый элегантный способ.
Например:
источник
Это способ найти индекс объекта в массиве
источник
Это работает без пользовательского кода
источник
Вы можете просто использовать
Нет подчеркивания, нет, просто уменьшить.
источник
источник
Вы можете создать свой собственный прототип, чтобы сделать это:
что-то вроде:
источник
Я предпочитаю использовать
findIndex()
метод:index
даст вам номер индекса.источник