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.