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.

Ryan Florence
fonte

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".

Milhas
fonte
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) { ... }
Jacob
fonte
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;
}
Patrick Hayes
fonte
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.

Luke Schafer
fonte
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]]
Rob Fox
fonte
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
jitendra varshney
fonte
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]]
Sophie Alpert
fonte
16

ES6

const [first] = Object.keys(obj)
Richard Ayotte
fonte
Funciona, mas você pode explicar como isso funciona? Apenas mostrar o código falha em me fazer entender.
Daan
1
É uma tarefa de desestruturação . Essencialmente, ele atribui o primeiro elemento da matriz retornada à variável entre colchetes.
Richard Ayotte
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]

Dexygen
fonte
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.

PatrikAkerstrand
fonte
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'} )
CMS
fonte
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'
LDL
fonte
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'
yckart
fonte
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));
diyism
fonte
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