Получение первого индекса объекта

Рассмотреть возможность:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

Как бы я это сделал:

var first = object[0];
console.log(first);

Очевидно, это не работает, потому что первый индекс называется foo, а не 0.

console.log(object['foo']);

работает, но я не знаю, что он называется foo. Это можно было назвать как угодно. Я просто хочу первое.


person Ryan Florence    schedule 26.05.2009    source источник


Ответы (14)


Если порядок объектов имеет значение, вам следует пересмотреть схему JSON, чтобы хранить объекты в массиве:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

или, может быть:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Как указывает Бен Альперт, свойства объектов Javascript неупорядочены, и ваш код нарушается, если вы ожидаете, что они будут перечисляться в том же порядке, в котором они указаны в литерале объекта - «первого» свойства не существует.

person Miles    schedule 26.05.2009
comment
Я никогда не видел, чтобы for (i in obj) делал что-то в другом порядке, вы говорите, что иногда for (i in obj) выгоняет вещи в другом порядке? - person Ryan Florence; 26.05.2009
comment
Не исключено, что так и будет. В спецификации сказано, что его не нужно перечислять в определенном порядке. Это в значительной степени означает, что этот порядок может измениться. - person PatrikAkerstrand; 26.05.2009
comment
Большинство браузеров в наши дни действительно сохраняют порядок вставки, но так было не всегда; это не требуется спецификацией, и были последние версии Chrome, в которых порядок вставки не сохранялся. - person Miles; 26.05.2009
comment
По мере того, как я углублялся в то, что я делал, порядок вещей становился более важным (я думал, что меня заботит только первое, но я ошибался!), Поэтому стало ясно, что мои объекты хранятся в массиве, как вы предлагали. - person Ryan Florence; 28.05.2009
comment
Если вы знаете, что объект имеет только один элемент, значит, вы знаете порядок. - person danorton; 24.09.2010
comment
В большинстве случаев вы можете быть правы ... Однако предполагать это для всех - плохо. Например, если у вас нет контроля над объектом или есть только один элемент с (и вы не знаете окончательно имя). Хотя в большинстве других случаев я согласен. - person ; 02.04.2016
comment
На самом деле порядок объектов гарантирован, поскольку в ES2015 stackoverflow.com/questions/5525795/ - person Daniel; 22.05.2020

Просто для удовольствия это работает в JS 1.8.5

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

Это соответствует тому же порядку, что и при выполнении

for (o in obj) { ... }
person Jacob    schedule 10.07.2013
comment
Очистите лучший вариант, если не требуется совместимость с заклинаниями каменного века. - person Dag Sondre Hansen; 18.03.2014
comment
100% лучший ответ. Это самый простой и быстрый способ сделать это. - person Case; 14.12.2014
comment
Чтобы уточнить, согласно en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 не поддерживается до IE9. К сожалению, многие люди все еще находятся в каменном веке. - person Noremac; 15.12.2014
comment
Великий. Коротко и просто. Спасибо @Jacob - person Sariban D'Cl; 21.05.2015
comment
если кто-то использует IE9, я чувствую его боль. спасибо, это потрясающе - person CMS; 16.06.2017
comment
Это решение также очень удобно, когда вы используете объекты в качестве словарей ключей и значений, и вам нужно выбрать первый ключ, доступный в наборе (если есть), и вас не волнует порядок. - person Kyordhel; 23.11.2017
comment
Работает как шарм. Спасибо. - person moreirapontocom; 11.01.2020

Если вы хотите что-то лаконичное, попробуйте:

for (first in obj) break;

alert(first);

завернутый как функция:

function first(obj) {
    for (var a in obj) return a;
}
person Patrick Hayes    schedule 04.05.2010
comment
См. Ответ Люка Шафера ниже, он использует метод hasOwnProperty, чтобы гарантировать, что вы не захватите элементы прототипа. - person Code Commander; 01.08.2011
comment
Чтобы один лайнер работал во всех браузерах, включая IE8 и ниже, используйте for (var key in obj) if (obj.hasOwnProperty(key)) break;. Затем вы захотите использовать переменную key - person Ally; 06.09.2013
comment
не работает, если первый элемент является типом объекта. возвращает 0 - person snow; 09.08.2018
comment
Object.keys(obj)[0]; намного быстрее (0,072 мс), чем for (1,644 мс). - person Sebastian Ortmann; 27.09.2018

они не действительно упорядочены, но вы можете:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty() важно игнорировать прототипы объектов.

person Luke Schafer    schedule 26.05.2009
comment
В приведенном выше коде есть ошибка. Тип проверки должен быть typeof (i) - person jacob.toye; 20.02.2012
comment
@Napalm он имел в виду ошибку в проверяемом имени переменной, а не синтаксис. Вы правы, но многим нравится брекетинг для удобочитаемости. - person Luke Schafer; 14.12.2012
comment
Спасибо. Это потрясающе. - person Santosh; 03.06.2017

Это не даст вам первый, поскольку объекты javascript неупорядочены, однако в некоторых случаях это нормально.

myObject[Object.keys(myObject)[0]]
person Rob Fox    schedule 06.11.2013

для первого ключа объекта вы можете использовать

console.log(Object.keys(object)[0]);//print key's name

для ценности

console.log(object[Object.keys(object)[0]]);//print key's value
person jitendra varshney    schedule 05.01.2017

Невозможно получить первый элемент, поскольку «хэши» (объекты) в JavaScript имеют неупорядоченные свойства. Лучше всего хранить ключи в массиве:

var keys = ["foo", "bar", "baz"];

Затем используйте это, чтобы получить правильное значение:

object[keys[0]]
person Sophie Alpert    schedule 26.05.2009

Используя подчеркивание, вы можете использовать _.pairs, чтобы получить первую запись объекта в качестве пары ключ-значение следующим образом:

_.pairs(obj)[0]

Тогда ключ будет доступен с дополнительным нижним индексом [0], значение с [1]

person Dexygen    schedule 29.08.2013
comment
Лучше всего работает при использовании underscore.js. Как раз то, что мне было нужно ... Спасибо, Джордж! - person Goldengalaxy; 22.11.2017

Вчера у меня была такая же проблема. Я решил это так:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

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

person PatrikAkerstrand    schedule 26.05.2009
comment
Привет, @PatrikAkerstrand раньше, я случайно нажал голос против. Пожалуйста, внесите любые изменения в свой ответ, чтобы я отменил его. Извините. - person rogeriolino; 02.12.2016

Вы можете сделать что-то вроде этого:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )
person Christian C. Salvadó    schedule 26.05.2009

Чтобы получить первый ключ вашего объекта

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'
person ldls    schedule 08.03.2017
comment
Чем отличается этот ответ от ответа Иакова? - person YakovL; 08.03.2017
comment
это дает уверенность новичкам в том, что такой код работает идеально. - person Santosh; 03.06.2017


Мое решение:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));
person diyism    schedule 30.12.2011
comment
хороший, только ... твой стиль кодирования! что за черт? эти подтяжки повсюду! - person flying sheep; 25.06.2012
comment
Вы знаете стиль питона? Я просто добавил фигурные скобки с вертикальным выравниванием в стиль Python. Во всяком случае, ад - это другие люди, :-D - person diyism; 28.06.2012

person    schedule
comment
Это работает, но не могли бы вы объяснить, как это работает? Просто показать код не дает мне понять его. - person Daan; 07.12.2018
comment
Это деструктурирующее назначение. По сути, он присваивает первый элемент возвращаемого массива переменной в квадратных скобках. - person Richard Ayotte; 09.12.2018