Используйте find()
метод:
myArray.find(x => x.id === '45').foo;
От MDN :
find()
Метод возвращает первое значение в массиве, если элемент в массиве удовлетворяет условиям функции. В противном случае undefined
возвращается.
Если вы хотите найти его индекс , используйте findIndex()
:
myArray.findIndex(x => x.id === '45');
От MDN :
findIndex()
Метод возвращает индекс первого элемента в массиве , который удовлетворяет условие тестирования функции. В противном случае -1 возвращается.
Если вы хотите получить массив подходящих элементов, используйте filter()
вместо этого метод:
myArray.filter(x => x.id === '45');
Это вернет массив объектов. Если вы хотите получить массив foo
свойств, вы можете сделать это с помощью map()
метода:
myArray.filter(x => x.id === '45').map(x => x.foo);
Примечание: такие методы, как find()
or filter()
, и функции стрелок не поддерживаются более старыми браузерами (например, IE), поэтому, если вы хотите поддерживать эти браузеры, вы должны перенести свой код с помощью Babel (с полифилом ).
Михал Перлаковский
источник
Поскольку вы уже используете jQuery, вы можете использовать функцию grep, которая предназначена для поиска в массиве:
В результате получается массив с найденными элементами. Если вы знаете, что объект всегда существует и что он встречается только один раз, вы можете просто использовать его
result[0].foo
для получения значения. В противном случае вы должны проверить длину полученного массива. Пример:источник
===
вместо==
, чтобы избежать странных проблем с==
оператором JavaScript .e.id
иid
будут строками, я думаю, что это нормально использовать==
. Но если вы не уверены, вы можете столкнуться с проблемами (поскольку'' == 0
есть,true
но'' === 0
естьfalse
). Не говоря уже о том, что===
кажется быстрее ( stackoverflow.com/questions/359494/… ).===
потому что это работает точно так же как==
в других языках программирования. Я считаю,==
что в JavaScript не существует.Другое решение - создать объект поиска:
Это особенно интересно, если вам нужно сделать много поисков.
Это не потребует намного больше памяти, так как идентификаторы и объекты будут совместно использоваться.
источник
lookup
объекта - пустая трата времени.ECMAScript 2015 предоставляет метод find () для массивов:
Работает без внешних библиотек. Но если вам нужна поддержка старых браузеров, вы можете включить этот полифилл .
источник
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Но это старый ответ, который был написан до того, как синтаксис ES2015 был так же хорошо поддержан, как и сейчас. @ Gothdo в ответ в настоящее время является наиболее актуальной в потоке.myArray.find(d => d.id === 45)?.foo
.У Underscore.js есть хороший метод для этого:
источник
Я думаю, что самый простой способ будет следующим, но он не будет работать в Internet Explorer 8 (или ранее):
источник
for
?for
циклом.for
цикл завершится при первом совпадении.id
Попробуйте следующее
источник
источник
Общая и более гибкая версия функции findById выше:
источник
Вы можете легко получить это, используя функцию map () :
Рабочий пример: http://jsfiddle.net/hunter/Pxaua/
источник
map
автоматически удаляетnull
элементы. Это звучит вводящим в заблуждение для меня и для общей концепцииmap
, поскольку результат не имеет такой же длины оригинальной коллекции.Вы можете использовать фильтры,
источник
Хотя здесь есть много правильных ответов, многие из них не учитывают тот факт, что это излишне дорогая операция, если она выполняется более одного раза. В крайнем случае это может стать причиной реальных проблем с производительностью.
В реальном мире, если вы обрабатываете много элементов, и производительность вызывает беспокойство, гораздо быстрее изначально создать поиск:
затем вы можете получить предметы в определенное время, как это:
Вы можете также рассмотреть возможность использования карты вместо объекта в качестве поиска: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
источник
Используя родной
Array.reduce
возвращает элемент объекта, если найден, в противном случае
false
источник
Если вы делаете это несколько раз, вы можете настроить карту (ES6):
Тогда вы можете просто сделать:
источник
Вот как я могу это сделать в чистом JavaScript, самым минимальным образом, который я могу себе представить, работает в ECMAScript 3 или более поздней версии. Он возвращается, как только совпадение найдено.
источник
Более общий и короткий
в вашем случае Ex.
var element = findFromArray(myArray,'id',45)
это даст вам весь элемент.источник
Вы можете попробовать Sugarjs с http://sugarjs.com/ .
У него очень приятный метод для массивов
.find
. Таким образом, вы можете найти такой элемент:Вы также можете передать объект с дополнительными свойствами, чтобы добавить еще одно "where-предложение".
Обратите внимание, что Sugarjs расширяет родные объекты, и некоторые люди считают это очень злым ...
источник
find
. Я предлагаю, чтобы, если вы хотите расширить собственные прототипы, всегда используйте более конкретные имена, оставляя самые простые из них для будущих стандартных разработок.Опираясь на принятый ответ:
JQuery:
Или CoffeeScript:
источник
В последнее время мне приходится сталкиваться с тем же, что и при поиске строки из огромного массива.
После некоторого поиска я обнаружил, что это будет легко сделать с помощью простого кода:
Код:
См. Https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
источник
Итерировать по любому элементу в массиве. Для каждого элемента, который вы посещаете, проверьте его идентификатор. Если это совпадение, верните его.
Если вы просто хотите код:
И то же самое, используя методы массива ECMAScript 5:
источник
Пока браузер поддерживает ECMA-262 , 5-е издание (декабрь 2009 г.), это должно работать почти в одну строку:
источник
bFound
это просто логическое значение,true
если элемент удовлетворяет требуемому условию.Вы можете сделать это даже в чистом JavaScript, используя встроенную функцию «filter» для массивов:
Так что теперь просто передайте "id" вместо
key
и "45" вместоvalue
, и вы получите полный объект, соответствующий идентификатору 45. Так что,источник
использование
Array.prototype.filter()
функцию.ДЕМО : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
ФИЛЬТР
источник
.filter
методobj.info
во вложенном цикле.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Мы можем использовать методы Jquery
$.each()/$.grep()
или
использовать синтаксис ES6:
Или используйте Lodash https://lodash.com/docs/4.17.10#filter , Подчеркните https://underscorejs.org/#filter
источник
Мне очень понравился ответ, предоставленный Аароном Дигуллой, но мне нужно было сохранить массив объектов, чтобы я мог повторить его позже. Поэтому я изменил это
источник
Использование:
Он должен вернуть объект по id.
источник
Это решение может также помочь:
Я сделал это точно так же,
$.grep
и если один объект будет найден, функция вернет объект, а не массив.источник
function will return the object, rather than an array
может получить ошибку, но я думаю, что это зависит от пользователей.Начиная от ответа aggaton в это функция , которая на самом деле возвращает элемент хотел (или ,
null
если не найден), учитываяarray
и наcallback
функцию , которая возвращает значение truthy для «правильного» элемента:Просто помните, что это не работает на IE8, так как не поддерживает
some
. Может быть предоставлен polyfill, или всегда есть классическийfor
цикл:Это на самом деле быстрее и компактнее. Но если вы не хотите изобретать велосипед, я предлагаю использовать служебную библиотеку, например, подчеркивание или lodash.
источник
Кратчайший,
источник
Рассмотрим «axesOptions» как массив объектов с форматом объекта {: field_type => 2,: fields => [1,3,4]}
источник