Как я могу перебрать все члены в объекте JavaScript, включая значения, которые являются объектами.
Например, как я могу пройти через это (доступ к «your_name» и «your_message» для каждого)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
По восточному времени
источник
источник
Ответы:
источник
for in
очень похож на традиционныйforeach
.В ECMAScript 5 вы можете комбинировать
Object.keys()
иArray.prototype.forEach()
:источник
for ... in ... hasOwnProperty
Модель можно назвать на что - нибудь, насколько я могу сказать (объект, массив пустой, неопределенный, истина, ложь, номер примитивные, объекты).Object.keys()
что делает его медленным, это скорееforEach()
повторный доступ к.length
! Еслиfor
вместо этого вы используете классический -loop, он почти вдвое быстрее, чемfor..in
+hasOwnProperty()
в Firefox 33.Проблема с этим
в том, что вы также будете проходить через прототип примитивного объекта.
С этим вы избежите этого:
источник
hasOwnProperty
внутри вашихfor
-in
петель.В ES6 / 2015 вы можете проходить по объекту следующим образом: (используя функцию стрелки )
jsbin
В ES7 / 2016 вы можете использовать
Object.entries
вместоObject.keys
и циклически проходить через такой объект:Вышесказанное также будет работать как однострочник :
jsbin
Если вы хотите перебрать и вложенные объекты, вы можете использовать рекурсивную функцию (ES6):
jsbin
То же, что и функция выше, но с ES7
Object.entries()
вместоObject.keys()
:Здесь мы циклически изменяем значения вложенных объектов и возвращаем новый объект за один раз, используя в
Object.entries()
сочетании сObject.fromEntries()
( ES10 / 2019 ):источник
Использование Underscore.js
_.each
:источник
Если вы используете рекурсию, вы можете вернуть свойства объекта любой глубины
источник
I. ключи должны быть доступны,
And
of
иObject.keys
подход✔
in
подходИспользуйте это с осторожностью, так как это может напечатать свойства prototype'd
obj
Approach подход ES7
Тем не менее, во время редактирования я бы не рекомендовал метод ES7, потому что JavaScript инициализирует множество переменных внутри, чтобы построить эту процедуру (см. Отзывы для доказательства). Если вы не разрабатываете огромное приложение, которое заслуживает оптимизации, то это нормально, но если оптимизация является вашим приоритетом, вы должны подумать об этом.
II. нам просто нужно получить доступ к каждому значению,
And
of
иObject.values
подходБольше отзывов о тестах:
Object.keys
илиObject.values
производительность незначительныНапример,
Например
Object.values
, использование собственногоfor
цикла с кэшированными переменными в Firefox кажется немного быстрее, чем использованиеfor...of
цикла. Однако разница в том , что не важно , и Chrome работаетfor...of
быстрее , чем роднаяfor
петля, так что я бы рекомендовал использоватьfor...of
при работе сObject.values
в любом случае (4 - я и 6 - тестах).В Firefox
for...in
цикл действительно медленный, поэтому, когда мы хотим кэшировать ключ во время итерации, его лучше использоватьObject.keys
. Плюс Chrome работает обе структуры с одинаковой скоростью (1-й и последний тесты).источник
Я знаю, что уже поздно, но мне понадобилось 2 минуты, чтобы написать эту оптимизированную и улучшенную версию ответа AgileJon:
источник
hasOwnProperty
вowns
и затем вызватьowns.call(obj, prop)
вместо того , чтобы просто вызов ,obj.hasOwnProperty(prop)
как этот ответ делает?obj
чтоhasOwnProperty
функция может быть определена сама по себе, поэтому она не будет использовать функцию fromObject.prototype
. Вы можете попробовать передfor
циклом, подобным этому,obj.hasOwnProperty = function(){return false;}
и он не будет перебирать любое свойство.источник
р значение
ИЛИ
источник
В ES7 вы можете сделать:
источник
источник
Несколько способов сделать это ...
1) 2 слоя для ... в петле ...
2) Использование
Object.key
3) Рекурсивная функция
И назовите это как:
источник
Вот улучшенная и рекурсивная версия решения AgileJon ( демо ):
Это решение работает для всех видов различной глубины.
источник
Другой вариант:
источник
ECMAScript-2017, только что завершенный месяц назад, представляет Object.values (). Так что теперь вы можете сделать это:
источник
Я думаю, стоит отметить, что jQuery хорошо с этим справляется
$.each()
.Смотрите: https://api.jquery.com/each/
Например:
$(this)
будучи единственным предметом внутри объекта. Перейдите$('.foo')
к переменной, если вы не хотите использовать механизм выбора jQuery.источник
Для циклического прохождения объекта JavaScript мы можем использовать forEach, а для оптимизации кода - функцию стрелки.
источник
Я не мог заставить вышеупомянутые должности делать то, что я хотел.
Поиграв с другими ответами здесь, я сделал это. Это взломано, но это работает!
Для этого объекта:
... этот код:
... производит это в консоли:
источник
Решение, которое работает для меня, заключается в следующем
источник
Экзотический - глубокий траверс
В этом решении мы используем заменитель, который позволяет глубоко пройти весь объект и вложенные объекты - на каждом уровне вы получите все поля и значения. Если вам нужно получить полный путь к каждому полю, посмотрите здесь
Показать фрагмент кода
источник
В моем случае (на основании предыдущего) возможно любое количество уровней.
результат:
источник