Каков наиболее эффективный способ получить первый элемент из ассоциативного массива в JavaScript?

StackOverflow https://stackoverflow.com/questions/177161

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

Array.prototype.getKey = function() {
  for (var prop in this)
    if (this.propertyIsEnumerable(prop))
      return prop;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top