Получение списка ключей объекта JavaScript

295

У меня есть объект JavaScript, как

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

Как я могу получить длину и список ключей в этом объекте?

user160820
источник
возможный дубликат Get Property Names в объектах JSON
TJ
@ TJ Я думаю, что это не совсем то же самое. Это объект, дубликат объекта JSON.
GuyT
если у вас есть подчеркивание, то просто _.keys (your_object)
minhajul
1
Поскольку с 2010 года все изменилось, было бы лучше принять ответ с наибольшим количеством голосов в качестве «ответа»
Джонас Уилмс

Ответы:

341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);

zed_0xff
источник
Я не думаю, что Javascript похож на PHP, где вы можете вообще пропустить первую строку? Не то, чтобы что-то подобное желательно делать в любом случае.
Барт ван Хейкелом
@ Барт: Нет, первая строка необходима в JavaScript.
Даниэль Вассалло
6
Вы должны взглянуть на комментарий Дэвида Моррисси ниже для крайнего случая здесь. Иногда принятие этого подхода приводит к появлению нежелательных членов прототипа в keys.
2
@pat: Если вы используете объектные литералы, это произойдет только в том случае, если вы расширяете Object.prototype, что вам не следует делать в любом случае. Однако для пользовательских конструкторов вы правы.
Саша Чедыгов
@BartvanHeukelom даже в июне 2010 года вызвал уведомление, поскольку это означает, что вы неявно печатаете объект. Присвоение []ему (или array()тогда) делает его массивом, который затем можно безопасно использовать в качестве массива.
Нильс Кеурентьес
627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

Это поддерживается большинством основных браузеров.

Анураг
источник
7
Тот факт, что он работает в Chrome, также означает, что он работает в Node.js, поскольку оба они построены на движке JavaScript V8.
Homme Zwaagstra
9
@fet В наше время да. Два года назад не так много.
AlbertEngelB
4
Обратите внимание, что это отличается от for(key in ob)! Object.keysне перечисляет ключи от прототипов, но .. in objделает.
Альберт
9
@fet windows7 поставляется с IE8. Как бы здорово это ни было, никоим образом это не будет приемлемым ответом, пока люди не перестанут использовать IE8.
прижимается
1
Здесь developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… вы найдете метод JavaScript, который работает правильно в старых браузерах и не переписывает функциональность в новых браузерах. Также см. Мой ответ ниже.
Сандро
27

Underscore.js делает преобразование довольно чистым:

var keys = _.map(x, function(v, k) { return k; });

Редактировать: я пропустил, что вы можете сделать это тоже:

var keys = _.keys(x);
mikebridge
источник
Это верно, фактический источник подчеркивания: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) throw new TypeError ('Invalid object'); var keys = []; for (var key in obj) if ( .has (obj, key)) keys.push (key); ключи возврата; };
Мигель Алехандро Фуэнтес Лопес
18

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

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

например:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
криогенный
источник
4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

чтобы получить доступ к любому значению из объекта, вы можете использовать obj [key];

Мохан Гундлапалли
источник
вам нужно увеличить индекс массива
Vivek
Индекс массива увеличивается автоматически на keys.length, который отличается для каждой итерации, поскольку каждая итерация вставляет значение.
KrekkieD
4
obj = {'a':'c','b':'d'}

Можешь попробовать:

[index for (index in obj)] 

это вернется:

['a','b']

чтобы получить список ключей или

[obj[index] for (index in obj)]

чтобы получить значения

Джим нолан
источник
Не работает в Google Chrome v16.0.912.75, но работает в Firefox
v10.0
4

Ответ Анурагса в основном правильный. Но для поддержки Object.keys(obj)старых браузеров вы также можете использовать приведенный ниже код, который скопирован с https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Он добавляет Object.keys(obj)метод, если он не доступен из браузера.

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 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 = [], prop, i;

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

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}
Sandro
источник
3

Обратите внимание, что в coffeescript это может быть выполнено во всех браузерах и узлах как

k for k of obj

и поэтому

(1 for _ of obj).length
Тим Джеймс
источник
3

Рекурсивное решение для браузеров, поддерживающих ECMAScript 5:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};
Jordi
источник
3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
bajran
источник
3

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

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);
Мухаммед Джавад Ахмади
источник
3

В JavaScript объект представляет собой отдельную сущность со свойствами и типом.

Для извлечения значений из Object в виде массива: Object .values ​​(obj) // obj - это имя объекта, которое вы использовали. Результат -> ["value1", "value2", "value3", "value4"]

Для извлечения ключей из Object в виде массива: Object .keys (obj) // obj - это имя объекта, которое вы использовали Результат -> ["key1", "key2", "key3", "key4"]

Поскольку обе функции возвращают массив, вы можете получить длину ключей или значение, используя свойство length. Например - Object .values ​​(obj) .length или Object .keys (obj) .length

Ракеш Сони
источник
2

Для строки с запятой, в которой перечислены ключи объекта JSON, попробуйте следующее:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */
Кристиан
источник
2

Используя ES6, вы можете использовать forEachдля перебора ключей объекта. Чтобы получить все ключи, которые вы можете использовать, Object.keysкоторый возвращает все ключи в объекте

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

Будет короткая рука из приведенного выше фрагмента, которая принимает только один параметр

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});
Rinav
источник
1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }
Пратамеш Савант
источник
0

используя ломтик, применить и объединить метод.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());

источник