Получить массив ключей объектов

Я хотел бы получить ключи объекта JavaScript как массив, либо в jQuery, либо в виде чистого JavaScript.

Существует ли менее верный способ?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

Ответ 1

Используйте Object.keys:

var foo = {
  'alpha': 'puffin',
  'beta': 'beagle'
};

var keys = Object.keys(foo);
console.log(keys) // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered).

Ответ 2

Вы можете использовать jQuery $.map.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
  return i;
});

Ответ 3

Конечно, Object.keys() - лучший способ получить ключи объекта. Если он недоступен в вашей среде, его можно выполнить тривиально, используя код, например, в вашем примере (за исключением того, что вам нужно учитывать, что ваш цикл будет перебирать все свойства в цепочке прототипов, в отличие от поведения Object.keys()).

Однако ваш пример кода...

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
    keys.push(key);
}

jsFiddle.

... может быть изменен. Вы можете выполнить назначение в переменной.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [], i = 0;
for (keys[i++] in foo) {}

jsFiddle.

Конечно, это поведение отличается от того, что действительно делает Object.keys() (jsFiddle). Вы можете просто использовать прокладку в документации MDN.

Ответ 4

Я не знаю о менее многословном, но я был вдохновлен на то, чтобы принудить следующее к одной строке одним запросом, не знаю, как это Pythonic, хотя;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);

Ответ 5

В случае, если вы ищете что-то, чтобы перечислить ключи вложенного объекта n-глубины в виде плоского массива:

const getObjectKeys = (obj, prefix = '') => {
  return Object.entries(obj).reduce((collector, [key, val]) => {
    const newKeys = [ ...collector, prefix ? '${prefix}.${key}' : key ]
    if (Object.prototype.toString.call(val) === '[object Object]') {
      const newPrefix = prefix ? '${prefix}.${key}' : key
      const otherKeys = getObjectKeys(val, newPrefix)
      return [ ...newKeys, ...otherKeys ]
    }
    return newKeys
  }, [])
}

console.log(getObjectKeys({a: 1, b: 2, c: { d: 3, e: { f: 4 }}}))

Ответ 6

Резюме

Для получения всех ключей объекта вы можете использовать Object.keys(). Object.keys() принимает объект в качестве аргумента и возвращает массив всех ключей.

Пример:

const object = {
  a: 'string1',
  b: 42,
  c: 34
};

const keys = Object.keys(object)

console.log(keys);

console.log(keys.length) // we can easily access the total amount of properties the object has

Ответ 7

Если вы решили использовать Underscore.js, лучше

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
    keys.push(key);
});
console.log(keys);

Ответ 8

Вы можете использовать метод Javascript Object keys().

Метод Javascript Object.keys() возвращает массив с указанными именами свойств объекта в том же порядке, в котором мы получаем стандартный цикл.

Метод Object.keys() используется для возврата массива, элементы которого являются строками, соответствующими перечисляемым свойствам, найденным непосредственно на объекте.

Порядок свойств такой же, как и тот, который задан объектом в цикле вручную, применяется к свойствам.