Скажем, я создаю объект таким образом:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Каков наилучший способ получить список имен свойств? то есть я хотел бы получить некоторые переменные «ключи», такие что:
keys == ["ircEvent", "method", "regex"]
javascript
johnstok
источник
источник
_.keys(myJSONObject)
Ответы:
В современных браузерах (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) вы можете использовать встроенный метод Object.keys :
Выше есть полное заполнение, но упрощенная версия:
В качестве альтернативы замените
var getKeys
на,Object.prototype.keys
чтобы позволить вам вызывать.keys()
любой объект. Расширение прототипа имеет некоторые побочные эффекты, и я бы не рекомендовал это делать.источник
for (var key in myObject) {...}
Метод полезен для яваскрипта автономной работы за пределами браузеров и V8. Например, при передаче запросов Javascript Map-Reduce в RiakObject
объект не существует, поэтомуObject.keys
метод недоступен.Object.keys
возвращает только собственные свойства объекта. Я вижу это как важное различие.Как указал slashnick , вы можете использовать конструкцию for для итерации объекта по его именам атрибутов. Однако вы будете перебирать все имена атрибутов в цепочке прототипов объекта. Если вы хотите перебирать только собственные атрибуты объекта, вы можете использовать метод Object # hasOwnProperty () . Таким образом, имея следующее.
источник
esc
клавишу, потому что объект имел около миллиона свойств, большинство из которых не использовалось, и у меня было предупреждение об этом.Как ответил Сэм Даттон, новый метод для этой цели был введен в ECMAScript 5-е издание.
Object.keys()
будет делать то, что вы хотите, и поддерживается в Firefox 4 , Chrome 6, Safari 5 и IE 9 .Вы также можете очень легко реализовать метод в браузерах, которые его не поддерживают. Однако некоторые реализации не полностью совместимы с Internet Explorer. Вот более совместимое решение:
Обратите внимание, что в настоящее время принятый ответ не включает проверку hasOwnProperty () и возвращает свойства, которые наследуются через цепочку прототипов. Он также не учитывает известную ошибку DontEnum в Internet Explorer, когда неперечислимые свойства в цепочке прототипов приводят к тому, что локально объявленные свойства с тем же именем наследуют свой атрибут DontEnum.
Реализация Object.keys () даст вам более надежное решение.
РЕДАКТИРОВАТЬ: после недавнего обсуждения с kangax , известным автором Prototype, я реализовал обходной путь для ошибки DontEnum на основе кода для его
Object.forIn()
функции, найденного здесь .источник
Object.prototype
. Однако часто бывает так, что более короткий код выглядит значительно более привлекательным, чем более крупный и надежный код, но смысл этого ответа - использовать ECMAScript 5-йObject.keys()
, который может быть реализован в браузерах, которые не поддерживают его с использованием этого кода. Нативная версия будет еще более производительной, чем эта.Object.keys
возвращает только массив строк, соответствующих перечисляемым свойствам объекта. Это может не иметь решающего значения при работе с нативными (определяемыми пользователем) объектами, но должно быть очень хорошо видно с хост-объектами (хотя неуказанное поведение хост-объектов - это отдельная, болезненная история). Для перечисления ВСЕХ (включая не перечислимых) свойств ES5 предоставляетObject.getOwnPropertyNames
(см. Его поддержку в моей сравнительной таблице - kangax.github.com/es5-compat-table )Object.keys(stuff)
и нетstuff.keys()
?Обратите внимание, что Object.keys и другие методы ECMAScript 5 поддерживаются в Firefox 4, Chrome 6, Safari 5, IE 9 и выше.
Например:
Таблица совместимости ECMAScript 5: http://kangax.github.com/es5-compat-table/
Описание новых методов: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
источник
Object.getOwnPropertyNames(obj)
Эта функция также показывает неперечислимые свойства в дополнение к тем, которые показаны
Object.keys(obj)
.В JS каждое свойство имеет несколько свойств, включая логическое
enumerable
.В общем случае неперечислимые свойства являются более "внутренними" и используются реже, но иногда полезно взглянуть на них, чтобы увидеть, что происходит на самом деле.
Пример:
Также обратите внимание, как:
Object.getOwnPropertyNames
иObject.keys
не ходите по цепочке прототипов, чтобы найтиbase
for in
делаетПодробнее о цепочке прототипов здесь: https://stackoverflow.com/a/23877420/895245
источник
Я большой поклонник функции дампа.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
источник
https://j11y.io/demos/prettyprint/
?Может сделать это с помощью jQuery следующим образом:
источник
если вы пытаетесь получить только элементы, но не функции, тогда этот код может помочь вам
это часть моей реализации HashMap, и мне нужны только ключи, «this» - это объект hashmap, содержащий ключи
источник
Это будет работать в большинстве браузеров, даже в IE8, и никаких библиотек не требуется. вар я твой ключ.
источник
Под браузерами, поддерживающими js 1.8:
источник
Mozilla имеет полную информацию о том, как сделать это в браузере, где это не поддерживается, если это поможет:
Вы можете включить его как угодно, но, возможно, в какой-нибудь
extensions.js
файл в верхней части стека скриптов.источник
использование
Reflect.ownKeys()
Object.keys и Object.getOwnPropertyNames не могут получить не перечисляемые свойства. Это работает даже для не перечисляемых свойств.
источник
IE не поддерживает (я в obj) для нативных свойств. Вот список всех реквизитов, которые я смог найти.
Кажется, stackoverflow выполняет некоторую глупую фильтрацию.
Список доступен в нижней части этого сообщения группы Google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
источник
Поскольку я использую underscore.js почти в каждом проекте, я бы использовал
keys
функцию:Результат этого будет:
источник
Опираясь на принятый ответ.
Если у объекта есть свойства, которые вы хотите вызвать, скажем .properties () try!
источник
Решение работает на моих случаях и кросс-браузер:
источник