Как вывести свойства объекта JavaScript?
Описание проблемы на StackOverflow:
Я создал объект следующим образом:
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Теперь мне нужно получить список имен свойств этого объекта. Я хочу, чтобы в итоге у меня была переменная keys
, которая выглядела бы так:
keys == ["ircEvent", "method", "regex"]
Какой наилучший способ сделать это?
5 ответ(ов)
Функция Object.getOwnPropertyNames(obj)
возвращает массив всех собственных свойств объекта obj
, включая и те, что не являются перечисляемыми (в отличие от Object.keys(obj)
, которая возвращает только перечисляемые свойства).
Каждое свойство в JavaScript имеет несколько метаданных, одним из которых является логическое значение enumerable
. В общем, не перечисляемые свойства используются реже и считаются более "внутренними", однако иногда полезно заглянуть в них, чтобы лучше понять, что происходит.
Пример:
var o = Object.create({base: 0});
Object.defineProperty(o, 'yes', {enumerable: true});
Object.defineProperty(o, 'not', {enumerable: false});
console.log(Object.getOwnPropertyNames(o)); // [ 'yes', 'not' ]
console.log(Object.keys(o)); // [ 'yes' ]
for (var x in o)
console.log(x); // yes, base
Обратите внимание на следующие моменты:
Object.getOwnPropertyNames
иObject.keys
не поднимаются по цепочке прототипов, чтобы найтиbase
.for...in
цикл делает это.
Больше информации о цепочке прототипов можно найти здесь: https://stackoverflow.com/a/23877420/895245
Вы можете сделать это с помощью jQuery следующим образом:
var objectKeys = $.map(object, function(value, key) {
return key;
});
Этот код создает массив objectKeys
, который содержит ключи всех свойств объекта object
. Метод $.map()
используется для перебора объекта, и в колбэк-функции возвращается ключ каждого свойства.
Если вам нужно получить только ключи объекта, минуя функции, то приведённый ниже код может быть вам полезен:
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if (typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
Этот код является частью вашей реализации HashMap, где this
– это объект HashMap, содержащий ключи. Цикл for...in
проходит по всем свойствам объекта, и проверка на тип гарантирует, что вы добавляете в массив только те свойства, которые не являются функциями.
Этот код будет работать в большинстве браузеров, включая IE8, и не требует использования каких-либо библиотек. В данном случае var i
служит ключом для перебора объекта.
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
В этом примере мы создаём объект myJSONObject
, в котором содержатся различные ключи и значения. Затем мы инициализируем пустой массив keys
, в который будем добавлять ключи из объекта. С помощью цикла for...in
мы перебираем все свойства myJSONObject
, добавляя каждый ключ (i
) в массив keys
. В результате, при вызове alert(keys);
, будет показан список ключей объекта: ircEvent
, method
, regex
.
Вы можете использовать метод Reflect.ownKeys()
для получения всех свойств объекта, включая как перечисляемые, так и не перечисляемые свойства. Этот метод возвращает массив всех ключей (включая символы) объекта.
Пример использования:
var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]
Как видно из примера, Object.keys()
и Object.getOwnPropertyNames()
не могут получить неперечисляемые свойства. Однако Reflect.ownKeys()
работает даже для неперечисляемых свойств.
Например:
var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]
В этом случае вы видите, что символ, добавленный в объект, также был успешно возвращен в виде части массива ключей. Это делает Reflect.ownKeys()
удобным инструментом для получения всех свойств объекта вне зависимости от их характеристик.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"