Как вывести список свойств объекта JavaScript? - PullRequest
772 голосов
/ 16 октября 2008

Скажем, я создаю объект таким образом:

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

Каков наилучший способ получить список имен свойств? то есть я хотел бы получить несколько переменных ключей, таких как:

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

Ответы [ 16 ]

6 голосов
/ 19 июня 2013

Mozilla имеет полную информацию о реализации о том, как сделать это в браузере, где это не поддерживается, если это поможет:

if (!Object.keys) {
  Object.keys = (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

      var result = [];

      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }

      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    };
  })();
}

Вы можете включить его как хотите, но, возможно, в какой-нибудь файл extensions.js в верхней части стека скриптов.

4 голосов
/ 13 августа 2015

Поскольку я использую underscore.js почти в каждом проекте, я бы использовал функцию keys:

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));

Вывод этого будет:

['name', 'hello']
4 голосов
/ 03 июня 2009

IE не поддерживает (я в obj) для нативных свойств. Вот список всех реквизитов, которые я смог найти.

Похоже, что stackoverflow выполняет некоторую глупую фильтрацию.

Список доступен в нижней части этого сообщения группы Google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0

3 голосов
/ 28 апреля 2015

Опираясь на принятый ответ.

Если у объекта есть свойства, которые вы хотите вызвать, скажем .properties () try!

var keys = Object.keys(myJSONObject);

for (var j=0; j < keys.length; j++) {
  Object[keys[j]].properties();
}
1 голос
/ 09 сентября 2018

Использование Reflect.ownKeys()

var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]

Object.keys и Object.getOwnPropertyNames не может получить не перечисляемых свойств. Он работает даже для не перечисляемых свойств.

var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]
0 голосов
/ 07 августа 2016

Решение работает на моих кейсах и кросс-браузер:

var getKeys = function(obj) {
    var type = typeof  obj;
    var isObjectType = type === 'function' || type === 'object' || !!obj;

    // 1
    if(isObjectType) {
        return Object.keys(obj);
    }

    // 2
    var keys = [];
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            keys.push(i)
        }
    }
    if(keys.length) {
        return keys;
    }

    // 3 - bug for ie9 <
    var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
    if(hasEnumbug) {
        var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
            'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

        var nonEnumIdx = nonEnumerableProps.length;

        while (nonEnumIdx--) {
            var prop = nonEnumerableProps[nonEnumIdx];
            if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                keys.push(prop);
            }
        }

    }

    return keys;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...