Отримання списку ключових об’єктів JavaScript


295

У мене є об’єкт JavaScript, як

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

Як я можу отримати довжину та список клавіш у цьому об’єкті?



@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);


Я не думаю, що Javascript схожий на PHP, де ви можете пропустити перший рядок взагалі? Не те, щоб щось подібне доцільно робити все одно.
Барт ван Хекелом

@Bart: Ні, перший рядок необхідний у JavaScript.
Даніель Вассалло

6
Ви можете поглянути на коментар Девіда Морріссі нижче, щоб ознайомитись із кращим випадком тут. Іноді такий підхід призведе до появи небажаних членів прототипу в keys.

2
@pat: Якщо ви використовуєте об'єктні літерали, це відбудеться лише в тому випадку, якщо ви розширите Object.prototype, чого ви не повинні робити все одно. Однак для конструкторів на замовлення ви маєте рацію.
Саша Чедигов

@BartvanHeukelom ще в червні 2010 року, що викликало повідомлення, оскільки це означає, що ви неявно набираєте об'єкт. Присвоєння []йому (або array()тоді) робить його масивом, який ви зможете безпечно використовувати як масив.
Niels Keurentjes

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);

Це правильно, власне джерело підкреслення: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = функція (obj, ключ) {return hasOwnProperty.call (obj, ключ); }; _.keys = nativeKeys || функція (obj) {if (obj! == Object (obj)) кинути новий TypeError ('Недійсний об'єкт'); 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;
};
}());
}

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;
};

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

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


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 - це ім'я об'єкта, який ви використовували Result -> ["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); 
});


0

за допомогою фрагмента застосувати та приєднати метод.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.