Каков наиболее эффективный способ получить первый элемент из ассоциативного массива в 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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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

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