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

201

Рассматривать:

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

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

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

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

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

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

Райан Флоренс
источник

Ответы:

61

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

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

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

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

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

миль
источник
6
Я никогда не видел, чтобы (я в obj) делал вещи в другом порядке, вы говорите, что иногда for (я в obj) выгоняет вещи в другом порядке?
Райан Флоренс
4
Возможно, что так и будет. В спецификации сказано, что его не нужно перечислять в определенном порядке. Это в значительной степени означает, что этот порядок может измениться.
PatrikAkerstrand
5
Большинство браузеров в наши дни сохраняют порядок вставки, но это не всегда так; это не требуется спецификацией, и были последние версии Chrome, которые не сохраняли порядок вставки.
Майлз
1
По мере того, как я углублялся в то, что делал, порядок вещей становился все более важным (я думал, что заботился только о первом, но я ошибался!), Поэтому было ясно, что мои объекты хранятся в массиве, как вы и предлагали.
Райан Флоренс
1
Если вы знаете, что объект имеет только один элемент, то вы знаете порядок.
Данортон
329

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

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

Это соответствует тому же порядку, который вы видели бы делать

for (o in obj) { ... }
Иаков
источник
24
Очистить лучший вариант, если не требуется совместимость с обратным словом каменного века.
Даг Сондре Хансен
1
100% лучший ответ. Это самый простой и быстрый способ сделать это.
Дело
3
Просто для пояснения, согласно en.wikipedia.org/wiki/JavaScript#Version_history, JS 1.8.5 не поддерживается до IE9. К сожалению, многие люди все еще находятся в каменном веке.
Норемак
Великий. Коротко и просто. Спасибо @Jacob
Sariban D'Cl
если кто-то использует IE9, я чувствую его боль. спасибо это удивительно
CMS
204

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

for (first in obj) break;

alert(first);

обернутый как функция:

function first(obj) {
    for (var a in obj) return a;
}
Патрик Хейс
источник
8
См. Ответ Люка Шефера ниже: он использует метод hasOwnProperty, чтобы гарантировать, что вы не захватите элементы-прототипы.
Code Commander
3
Для одного лайнера к работе во всех браузерах , включая IE8 и ниже использования for (var key in obj) if (obj.hasOwnProperty(key)) break;Затем вы хотите использовать keyпеременную
Алли
не работает, если первый элемент является типом объекта. возвращается 0
снег
Object.keys(obj)[0];намного быстрее (0,072 мс), чем for(1,664 мс).
Себастьян Ортман
77

они на самом деле не заказаны, но вы можете сделать:

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

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

Люк Шефер
источник
В приведенном выше коде есть ошибка. Проверка typeof должна быть typeof (i)
jacob.toye
@Napalm он имел в виду ошибку в проверяемом имени переменной, а не синтаксис. Вы правы, но многим нравится брекетинг для удобства чтения
Люк Шафер
Спасибо. Это удивительно
Сантош
76

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

myObject[Object.keys(myObject)[0]]
Роб Фокс
источник
39

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

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

для значения

console.log(object[Object.keys(object)[0]]);//print key's value
Джитендра Варшней
источник
18

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

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

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

object[keys[0]]
Софи Альперт
источник
16

ES6

const [first] = Object.keys(obj)
Ричард Айотт
источник
Это работает, но не могли бы вы объяснить, как это работает? Просто показ кода не помогает мне понять это.
Даан
1
Это деструктурирующее задание . По сути, он назначает первый элемент возвращенного массива переменной в квадратных скобках.
Ричард Айотт
12

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

_.pairs(obj)[0]

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

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

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

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.

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

PatrikAkerstrand
источник
1
Привет @PatrikAkerstrand рано, я случайно нажал в downvote. Пожалуйста, внесите любые изменения в свой ответ, чтобы я отменил это. Сожалею.
Рожериолино
7

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

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'} )
CMS
источник
6

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

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

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

// result will return 'foo1'
LDLs
источник
В чем разница этого ответа с ответом Иакова?
YakovL
это дает уверенность свежим, что этот вид кода работает отлично.
Сантош
5

На основании ответа CMS . Я не получаю значение напрямую, вместо этого я беру ключ по его индексу и использую его для получения значения:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'
yckart
источник
2

Мое решение:

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));
diyism
источник
12
хороший, только ... твой стиль кодирования! какого черта? эти брекеты есть везде!
летающая овца
2
Вы знаете стиль Python? Я только добавил вертикальные скобки в стиле Python. Во всяком случае, «Ад это другие люди», :-D
diyism