Мне нужно получить только первый элемент (фактически, только первый ключ) из довольно большого ассоциативного массива в JavaScript. Вот как я это делаю сейчас (используя jQuery):
getKey = function (data) {
var firstKey;
$.each(data, function (key, val) {
firstKey = key;
return false;
});
return firstKey;
};
Просто догадываюсь, но я бы сказал, что должен быть лучший (читай: более эффективный) способ сделать это. Какие-либо предложения?
ОБНОВЛЕНИЕ: Спасибо за содержательные ответы и комментарии! Я забыл свой JavaScript 101, в котором в спецификации говорится, что вам не гарантируется определенный порядок в ассоциативном массиве. Интересно, однако, что большинство браузеров реализуют это именно так. Я бы предпочел не сортировать массив перед получением этого первого ключа, но это может быть неизбежно, учитывая мой вариант использования.
Я думаю, он имел в виду первый элемент, который был вставлен в массив.
Если вы этого хотите, вам нужно будет создать собственную реализацию стека. Связанные массивы не сохраняют порядок ключей.
Они делают в JS - обратная совместимость! : D
На самом деле в ассоциативных массивах (т.е. объектах) нет элемента первый или последний. Единственный порядок, на который вы можете надеяться, - это порядок, в котором элементы были сохранены синтаксическим анализатором, и никаких гарантий согласованности с этим нет.
Но если вам нужен первым подошел, классический способ может быть немного проще:
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 в точном порядке, в котором они были добавлены к объекту во время выполнения.
(У меня закончилось место выше) Исключением является порядок перечисления свойств в цепочке прототипов, который по-прежнему варьируется от браузера к браузеру.
@CyprianGuerra Он должен нормально работать для "собственных" свойств и Erik уже добавил ответ с ним. Эти вопросы и ответы были опубликованы за год до того, как был официально указан Object.keys()
(EMCA 262 5th была выпущена в декабре 2009 года).
@JonathanLonowski Моя вина, извините, я как-то пропустил это. Спасибо что подметил это.
В дополнение к решению Джонатана мы также можем расширить функциональность массива по умолчанию:
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!
Если вам нужна поддержка старых браузеров, обязательно включите этот полифилл в свой скрипт: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Если это ассоциативный массив, как узнать, что это за первый элемент?