Каков наиболее эффективный способ получить первый элемент из ассоциативного массива в JavaScript? - PullRequest
39 голосов
/ 07 октября 2008

Мне нужно получить только первый элемент (фактически, только первый ключ) из довольно большого ассоциативного массива в JavaScript. Вот как я это делаю в настоящее время (используя jQuery):

getKey = function (data) {
    var firstKey;
    $.each(data, function (key, val) {
        firstKey = key;
        return false;
    });
    return firstKey;
};

Просто думаю, но я бы сказал, что должен быть лучший (читай: более эффективный) способ сделать это. Есть предложения?

ОБНОВЛЕНИЕ: Спасибо за проницательные ответы и комментарии! Я забыл свой JavaScript 101, в котором спецификация говорит, что вам не гарантирован определенный порядок в ассоциативном массиве. Интересно, однако, что большинство браузеров реализуют это таким образом. Я бы предпочел не сортировать массив до получения этого первого ключа, но это может быть неизбежным, учитывая мой вариант использования.

Ответы [ 3 ]

52 голосов
/ 28 октября 2014

Вы можете избежать создания функции, ссылаясь на первую запись, возвращаемую из Object.keys():

var firstKey = Object.keys(data)[0];

Для первой записи из отсортированного списка ключей просто добавьте вызов в метод .sort():

var firstKey = Object.keys(data).sort()[0];
42 голосов
/ 07 октября 2008

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

Но, если вы хотите, чтобы появилось первым , классический способ мог бы быть немного проще:

function getKey(data) {
  for (var prop in data)
    return prop;
}

Хотите избежать наследования свойств?

function getKey(data) {
  for (var prop in data)
    if (data.propertyIsEnumerable(prop))
      return prop;
}
2 голосов
/ 01 ноября 2012

В дополнение к решению Джонатана мы также можем расширить функциональность массива по умолчанию:

Array.prototype.getKey = function() {
  for (var prop in this)
    if (this.propertyIsEnumerable(prop))
      return prop;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...