Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 3

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

Array.prototype.getKey = function() {
  for (var prop in this)
    if (this.propertyIsEnumerable(prop))
      return prop;
}