Obtendo o primeiro índice de um objeto


201

Considerar:

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

Como eu faria isso:

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

Obviamente, isso não funciona porque o primeiro índice é nomeado foo, não 0.

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

funciona, mas eu não sei o nome foo. Pode ser nomeado qualquer coisa. Eu só quero o primeiro.

Respostas:


61

Se a ordem dos objetos for significativa, você deve revisar seu esquema JSON para armazenar os objetos em uma matriz:

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

ou talvez:

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

Como Ben Alpert aponta, as propriedades dos objetos Javascript são desordenadas e seu código é quebrado se você espera que elas sejam enumeradas na mesma ordem em que são especificadas no literal do objeto - não há propriedade "primeira".


6
Eu nunca vi (i in obj) fazer as coisas em uma ordem diferente, você está dizendo que às vezes para (i in obj) vai chutar as coisas em uma ordem diferente?
— 22919 Ryan Florence

4
É possível que sim. As especificações dizem que ele não precisa ser enumerado em uma ordem específica. Isso significa que essa ordem pode mudar.
— PatrikAkerstrand

5
Atualmente, a maioria dos navegadores preserva o pedido de inserção, mas esse nem sempre foi o caso; não é exigido pelas especificações, e havia versões recentes do Chrome que não preservavam o pedido de inserção.
— Miles

1
À medida que me aprofundava no que estava fazendo, a ordem das coisas se tornava mais importante (pensei que só me importava com a primeira, mas estava errado!), Então ficou claro para armazenar meus objetos em uma matriz, como você sugeriu.
— 21919 Ryan Florence

1
Se você sabe que o objeto possui apenas um elemento, você conhece a ordem.
— Danorton 24/09/10

329

Apenas por diversão, isso funciona no JS 1.8.5

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

Isso corresponde à mesma ordem que você veria fazendo

for (o in obj) { ... }

24
É claramente a melhor opção, a menos que seja necessária compatibilidade com palavras cruzadas da idade da pedra.
— Dag Sondre Hansen

1
100% a melhor resposta. Essa é a maneira mais fácil e rápida de fazer isso.
— Case

3
Apenas para esclarecer, de acordo com en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 não é suportado antes do IE9. Infelizmente, muitas pessoas ainda estão na idade da pedra.
— Noremac

Muito bom. Curto e simples. Obrigado @Jacob
— Sariban D'Cl

se alguém estiver usando o IE9, sinto sua dor. graças isso é incrível
— CMS

204

Se você quiser algo conciso, tente:

for (first in obj) break;

alert(first);

envolvido como uma função:

function first(obj) {
    for (var a in obj) return a;
}

8
Veja a resposta de Luke Schafer abaixo, ele usa o método hasOwnProperty para garantir que você não pegue membros do protótipo.
— Code Commander

3
Para um um forro de trabalho em todos os navegadores, incluindo o IE8 e abaixo uso for (var key in obj) if (obj.hasOwnProperty(key)) break;Então você vai querer usar a keyvariável
— Ally

não funciona se o primeiro elemento for um tipo de objeto. retorna 0
— neve

Object.keys(obj)[0];é muito mais rápido (0,072ms) do que for(1,644ms).
— Sebastian Ortmann 26/09

77

eles não são realmente encomendados, mas você pode:

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

o .hasOwnProperty()é importante para ignorar objetos protótipo.


Há um erro no código acima. A verificação typeof deve ser typeof (i)
— jacob.toye

@ Napalm, ele estava se referindo ao erro no nome da variável que está sendo verificada, não na sintaxe. Você está certo, mas muitas pessoas como o escalonamento para facilitar a leitura
— Luke Schafer

Obrigado. É incrível.
— Santosh

76

Isso não fornecerá o primeiro, pois os objetos javascript não são ordenados; no entanto, isso é bom em alguns casos.

myObject[Object.keys(myObject)[0]]

39

para a primeira chave do objeto, você pode usar

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

por valor

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

18

Não há como obter o primeiro elemento, pois os "hashes" (objetos) no JavaScript têm propriedades não ordenadas. Sua melhor aposta é armazenar as chaves em uma matriz:

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

Em seguida, use isso para obter o valor adequado:

object[keys[0]]


12

Usando sublinhado, você pode usar _.pairs para obter a primeira entrada do objeto como um par de valores-chave da seguinte maneira:

_.pairs(obj)[0]

Em seguida, a chave estaria disponível com mais [0] índice, o valor com[1]


Funciona melhor quando o underscore.js é usado. Exatamente o que eu precisava ... Obrigado, George!
— precisa

10

Eu tive o mesmo problema ontem. Eu resolvi assim:

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.

Não é a solução mais elegante e tenho certeza de que ela pode gerar resultados diferentes em navegadores diferentes (ou seja, as especificações dizem que a enumeração não é necessária para enumerar as propriedades na mesma ordem em que foram definidas). No entanto, eu só tinha uma única propriedade no meu objeto, o que não era um problema. Eu só precisava da primeira chave.


1
Oi @PatrikAkerstrand cedo, eu acidentalmente cliquei no voto negativo. Faça qualquer alteração na sua resposta para eu desfazer. Desculpe.
— Rogeriolino 02/12/19

7

Você poderia fazer algo assim:

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'} )

6

Para obter a primeira chave do seu objeto

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

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

// result will return 'foo1'

Qual é a diferença desta resposta para a de Jacó?
— YakovL

dá a certeza de que esse tipo de código funciona perfeitamente.
— Santosh

5

Com base na resposta do CMS . Eu não obtenho o valor diretamente; em vez disso, pego a chave em seu índice e o uso para obter o valor:

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'

2

Minha solução:

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));

12
legal, apenas ... o seu estilo de codificação! que diabos? esses aparelhos estão em toda parte!
— ovelha voadora

2
Você conhece o estilo python? Acabei de adicionar chaves alinhadas na vertical no estilo python. Enfim, "O inferno é outras pessoas", :-D
— diyism
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.