Отримання списку асоціативних ключів масиву


258

Я маю асоціативний масив у Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

Як отримати ключі цього словника? тобто я хочу

var keys = ["cats", "dogs"];

Редагувати через 7 років: Просто для коректності термінології - у Javascript немає такого поняття, як «асоціативний масив» - це технічно просто objectі це потрібні об’єктні ключі.



Дякуємо за уточнення термінології! Чи можете ви зробити це трохи більше в яскраво-червоних миготливих вогнях?
Джо Філіпс

@Joe Я зроблю це першим результатом в Google для вас, коли отримаю шанс
Simon_Weaver

Відповіді:


84

Ви можете використовувати: Object.keys(obj)

Приклад:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Див. Посилання нижче для підтримки браузера. Він підтримується в Firefox 4.20, Chrome 5, IE9. Посилання нижче містить фрагмент коду, який ви можете додати, якщо Object.keys()він не підтримується у вашому браузері.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


Я переключаю це на прийняту відповідь зараз. Тільки IE8 вже не підтримує його (для якого доступна
поліфайл

382

Спробуйте це:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyпотрібна, оскільки в об'єкт прототипу Windows можна вставити ключі dictionary. Але ти зазвичай не хочеш, щоб ці ключі були включені у ваш список.

Наприклад, якщо це зробити:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

і потім зробіть for...inцикл dictionary, ви отримаєте aі b, але ви також отримаєте c.


Не потрібно оголошувати "var keys = []", якщо вам не потрібно використовувати його після циклу.
mzalazar

2
@mzalazar, вам краще зробити, або це буде глобальна змінна, що є поганою практикою.
b00t

@ b00t Я хоч це, оголошуючи змінну всередині циклу для циклу ... він не буде встановлений у глобальному просторі ... тепер ти змусив мене сумніватися в
гехе

2
@mzalazar, але ви не декларуєте це ( клавіші ) в будь-який момент, якщо ви просто використовуєте keys.push(key);. Ви просто витягуєте (і таким чином декларуєте) з глобального простору імен. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

Це твердження for..in .


1
Щойно зауважив, що між "собаками" та масивом вище має бути двокрапка замість коми. Припустимо, це пов’язано з транскрипцією.
Умблтон

68
Дуже важливо перевірити, чи в dictionary.hasOwnProperty(key)іншому випадку ви можете
виявити

4
З тієї ж статті: взаємодіє над переліченими властивостями об'єкта у довільному порядку . Якщо ключовий порядок важливий, вам потрібно зробити щось на зразок натискання їх на масив, сортування його, а потім за допомогою циклу for () отримати ключі від відсортованого масиву, за допомогою якого індексувати вихідний об’єкт.
mcmlxxxvi

1
Звичайно, справедливо оптимізувати, опустивши словник.hasOwnProperty перевірити, чи можете ви бути впевнені, що об’єкту не вистачає прототипу. Але важливо знати про можливість успадкування прототипу в цьому контексті, оскільки словники JavaScript справді є об'єктами.
fixermark

16

Лише коротка примітка, будьте обережні, використовуючи для..in, якщо ви використовуєте бібліотеку (jQuery, прототип тощо), оскільки більшість з них додають методи до створених Об'єктів (включаючи словники).

Це означає, що коли ви переходите на них, імена методів з'являться як ключі. Якщо ви користуєтеся бібліотекою, перегляньте документацію та знайдіть перелічний розділ, де ви знайдете правильні методи ітерації своїх об’єктів.


3

Простий JQUERY спосіб.

Це те, що я використовую
DictionaryObj як об’єкт словника javascript, через який ви хочете пройти. значення, ключовим зразком є ​​назви їх у словнику.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
для цього потрібен jQuery (це добре), але ви забули його згадати :-)
Simon_Weaver

@Exzile Імена аргументів у визначенні вашої функції дуже заплутані. У api.jquery.com/jquery.each написано, що зворотний виклик - це Функція (String propertyName, Object valueOfProperty). Ваші імена означають зворотне.
Кріс

@Chris Я оновлю це для вас. Дякуємо, що вказали на це.
Exzile

0

Зараз я використовую відповідь Роб-де-ла-Крус

Object.keys(obj)

а у файлі, завантаженому рано, у мене є рядки коду, запозичені з інших місць в Інтернеті, які висвітлюють випадки старих версій інтерпретаторів скриптів, у яких не вбудований Object.keys.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Я думаю, що це найкраще для обох світів для великих проектів: простий сучасний код та зворотна сумісна підтримка старих версій браузерів тощо.

Ефективно це ставить рішення JW у функцію, коли Object.keys (obj) Роб-де-ла-Крус не доступний для власного користування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.