9

Как вывести свойства объекта JavaScript?

9

Описание проблемы на StackOverflow:

Я создал объект следующим образом:

var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

Теперь мне нужно получить список имен свойств этого объекта. Я хочу, чтобы в итоге у меня была переменная keys, которая выглядела бы так:

keys == ["ircEvent", "method", "regex"]

Какой наилучший способ сделать это?

5 ответ(ов)

0

Функция 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

0

Вы можете сделать это с помощью jQuery следующим образом:

var objectKeys = $.map(object, function(value, key) {
  return key;
});

Этот код создает массив objectKeys, который содержит ключи всех свойств объекта object. Метод $.map() используется для перебора объекта, и в колбэк-функции возвращается ключ каждого свойства.

0

Если вам нужно получить только ключи объекта, минуя функции, то приведённый ниже код может быть вам полезен:

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 проходит по всем свойствам объекта, и проверка на тип гарантирует, что вы добавляете в массив только те свойства, которые не являются функциями.

0

Этот код будет работать в большинстве браузеров, включая 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.

0

Вы можете использовать метод 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() удобным инструментом для получения всех свойств объекта вне зависимости от их характеристик.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь