Если есть объект Javascript:
var objects={...};
Предположим, у него более 50 свойств, не зная имен свойств (это не зная «ключей»), как получить каждое значение свойства в цикле?
javascript
javascript-objects
Mellon
источник
источник
Ответы:
Используя простой
for..in
цикл:источник
enumerable
флаг false. Это - среди прочего - означает, что вы не будете перебирать методы класса, но вы будете перебирать методы, созданные другими способами.В зависимости от того, какие браузеры вы должны поддерживать, это можно сделать несколькими способами. Подавляющее большинство браузеров в дикой природе поддерживают ECMAScript 5 (ES5), но имейте в виду, что многие из приведенных ниже примеров используют
Object.keys
, чего нет в IE <9. См. Таблицу совместимости .ECMAScript 3+
Если вам нужно поддерживать более старые версии IE, то этот вариант для вас:
Вложенный
if
гарантирует, что вы не перечислите свойства в цепочке прототипов объекта (это поведение, которое вы почти наверняка хотите). Вы должны использоватьскорее, чем
потому что ECMAScript 5+ позволяет создавать объекты без прототипов
Object.create(null)
, и у этих объектов не будетhasOwnProperty
метода. Непослушный код может также создавать объекты, которые переопределяютhasOwnProperty
метод.ECMAScript 5+
Вы можете использовать эти методы в любом браузере, который поддерживает ECMAScript 5 и выше. Они получают значения из объекта и избегают перечисления по цепочке прототипов. Где
obj
ваш объект:Если вам нужно что-то более компактное или вы хотите быть осторожнее с функциями в циклах, тогда
Array.prototype.forEach
ваш друг:Следующий метод создает массив, содержащий значения объекта. Это удобно для зацикливания.
Если вы хотите сделать тех, кто использует,
Object.keys
безопасным противnull
(какfor-in
есть), то вы можете сделатьObject.keys(obj || {})...
.Object.keys
возвращает перечислимые свойства. Для перебора простых объектов этого обычно достаточно. Если у вас есть что-то с не перечисляемыми свойствами, с которыми вам нужно работать, вы можете использоватьObject.getOwnPropertyNames
вместоObject.keys
.ECMAScript 2015+ (AKA ES6)
Массивы проще итерировать с ECMAScript 2015. Вы можете использовать это в своих интересах при работе со значениями одно за другим в цикле:
Используя функции жирной стрелки ECMAScript 2015, отображение объекта в массив значений становится однострочным:
ECMAScript 2015 представляет
Symbol
, экземпляры которых могут использоваться в качестве имен свойств. Чтобы получить символы объекта для перечисления, используйтеObject.getOwnPropertySymbols
(эта функцияSymbol
не может использоваться для создания частных свойств). Предоставляется новыйReflect
API из ECMAScript 2015Reflect.ownKeys
, который возвращает список имен свойств (включая не перечисляемые) и символов.Массивы (не пытайтесь использовать)
Массивы были удалены из ECMAScript 6 перед публикацией. До их удаления решение выглядело бы так:
ECMAScript 2017+
ECMAScript 2016 добавляет функции, которые не влияют на эту тему. Спецификация ECMAScript 2017 добавляет
Object.values
иObject.entries
. Оба возвращают массивы (что будет удивительно для некоторых по аналогии сArray.entries
).Object.values
можно использовать как есть или сfor-of
циклом.Если вы хотите использовать и ключ, и значение, то
Object.entries
это для вас. Это производит массив, заполненный[key, value]
парами. Вы можете использовать это как есть или (обратите внимание также на назначение деструктуризации ECMAScript 2015) вfor-of
цикле:Object.values
шайбаНаконец, как отмечено в комментариях и teh_senaus в другом ответе, возможно, стоит использовать один из них в качестве прокладки. Не волнуйтесь, следующее не меняет прототип, оно просто добавляет метод
Object
(который гораздо менее опасен). Используя функции жирных стрелок, это также можно сделать в одной строке:который вы можете теперь использовать как
Если вы хотите избежать шимминга, когда
Object.values
существует натив , то вы можете сделать:В заключение...
Знайте о браузерах / версиях, которые вам нужно поддерживать. Вышесказанное является правильным, если реализованы методы или языковые функции. Например, до недавнего времени поддержка ECMAScript 2015 по умолчанию была отключена в V8, что обеспечивало работу таких браузеров, как Chrome. Следует избегать использования возможностей ECMAScript 2015 до тех пор, пока браузеры, которые вы намереваетесь поддерживать, не реализуют необходимые вам функции. Если вы используете babel для компиляции кода в ECMAScript 5, то у вас есть доступ ко всем функциям этого ответа.
источник
obj
дважды. Я думаю, создание вспомогательной функции неизбежно? Что-то вроде значений (obj).Object.values = obj => Object.keys(obj).map(key => obj[key]);
Вот функция многократного использования для получения значений в массив. Он также принимает во внимание прототипы.
источник
Object
не является большой проблемой (Object.keys
это обычная прокладка), вы, вероятно, думаете о модификации прототипа Object.hasOwnProperty()
? Как бы ключ был перебран в цикле того объекта, который не имеет свойства?Если у вас есть доступ к Underscore.js, вы можете использовать такую
_.values
функцию:источник
Если вам действительно нужен массив значений, я нахожу это чище, чем создание массива с циклом for ... in.
ECMA 5.1+
Стоит отметить, что в большинстве случаев вам не нужен массив значений, это будет быстрее:
Это перебирает ключи Объекта o. В каждой итерации к задается ключ o.
источник
ES5
Object.keys
источник
Вы можете пройтись по клавишам:
будет выводить:
источник
Для тех, кто рано адаптировался к эпохе CofeeScript, вот еще один аналог.
Что может быть лучше, чем это, потому что
objects
может быть уменьшено, чтобы быть напечатанным снова и уменьшило читаемость.источник
использовать полифилл как:
затем используйте
3) прибыль!
источник
ECMA2017 года:
Object.values(obj)
принесет вам все значения свойств в виде массива.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
источник
Очевидно - как я недавно узнал - это самый быстрый способ сделать это:
источник
Вопрос не указывает, нужны ли также унаследованные и не перечисляемые свойства.
Существует вопрос получения всего, наследуемых и неперечислимых свойств , которые Google не может легко найти.
Мое решение для этого:
И затем переберите их, просто используйте цикл for:
Показать фрагмент кода
источник
Используйте:,
Object.values()
мы передаем объект в качестве аргумента и получаем массив значений в качестве возвращаемого значения.Это возвращает массив данного объекта с собственными перечисляемыми значениями свойств. Вы получите те же значения, что и при использовании
for in
цикла, но без свойств в прототипе. Этот пример, вероятно, прояснит ситуацию:источник
источник
Вот функция, похожая на PHP array_values ()
Вот как получить значения объекта, если вы используете ES6 или выше:
источник
Совместим с ES7 даже некоторые браузеры пока не поддерживают его
Так как,
Object.values(<object>)
будет встроен в ES7 &Пока вы не дождетесь поддержки всех браузеров, вы можете обернуть его внутри функции:
Затем :
Как только браузеры станут совместимыми с ES7, вам не придется ничего менять в своем коде.
источник
Я понимаю, что немного опаздываю, но вот прокладка для нового
Object.values
метода Firefox 47источник
Object.entries делают это лучше.
источник
const myObj = { a:1, b:2, c:3 }
Получить все значения:
кратчайший путь:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
источник
источник
в использовании ECMAScript5
В противном случае, если ваш браузер не поддерживает его, используйте хорошо известные
for..in loop
источник
object[key]
для получения значений в цикле.for..in
(и hasOwnProperty), чтобы он ничего не получил ... Я бы хотел, чтобы ECMAScript 5-й был определенObject.pairs
(иObject.items
для[[key, value], ..]
), но, увы, нет.Сейчас я использую Dojo Toolkit, потому что старые браузеры не поддерживают
Object.values
.Вывод :
источник
использование
и если вы используете Google Chrome, откройте консоль с помощью Ctrl + Shift + j
Перейти к >> Консоль
источник