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

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

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

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

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

Если это ассоциативный массив, как узнать, что это за первый элемент?

John Millikin 07.10.2008 07:50

Я думаю, он имел в виду первый элемент, который был вставлен в массив.

Eric Schoonover 07.10.2008 07:56

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

Toby Hede 07.10.2008 08:01

Они делают в JS - обратная совместимость! : D

olliej 07.10.2008 09:19
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
44
4
45 087
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

На самом деле вам гарантирован порядок - не по спецификации, а просто благодаря тому, что слишком много сайтов в зависимости от порядка в прошлом. В основном вам гарантируется, что for (a in b) .. будет охватывать каждое перечислимое свойство в b в точном порядке, в котором они были добавлены к объекту во время выполнения.

olliej 07.10.2008 08:05

(У меня закончилось место выше) Исключением является порядок перечисления свойств в цепочке прототипов, который по-прежнему варьируется от браузера к браузеру.

olliej 07.10.2008 08:06

@CyprianGuerra Он должен нормально работать для "собственных" свойств и Erik уже добавил ответ с ним. Эти вопросы и ответы были опубликованы за год до того, как был официально указан Object.keys() (EMCA 262 5th была выпущена в декабре 2009 года).

Jonathan Lonowski 14.01.2015 21:16

@JonathanLonowski Моя вина, извините, я как-то пропустил это. Спасибо что подметил это.

cprn 14.01.2015 21:49

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

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

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

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

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

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

Это лучший, я думаю ... +1!

Riad 26.11.2014 15:13

Если вам нужна поддержка старых браузеров, обязательно включите этот полифилл в свой скрипт: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

thdoan 27.03.2015 11:50

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