Como acessar a primeira propriedade de um object em JavaScript?

Existe uma maneira elegante de acessar a primeira propriedade de um object

  1. onde você não sabe o nome de suas propriedades
  2. sem usar um loop como for .. in ou $.each do jQuery. $.each

Por exemplo, preciso acessar o object foo1 sem saber o nome de foo1:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; 

 var obj = { first: 'someVal' }; obj[Object.keys(obj)[0]]; //returns 'someVal' 

Usando isso, você também pode acessar outras propriedades por índices. Esteja ciente tho! Object.keys ordem de retorno de Object.keys não é garantida, de acordo com o ECMAScript. No entanto, não oficialmente, é por todas as principais implementações de navegadores, leia https://stackoverflow.com/a/23202095 para obter detalhes sobre isso.

Tente o loop for … in e interrompa após a primeira iteração:

 for (var prop in object) { // object[prop] break; } 

Use Object.keys para obter uma matriz das propriedades em um object. Exemplo:

 var example = { foo1: { /* stuff1 */}, foo2: { /* stuff2 */}, foo3: { /* stuff3 */} }; var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable) 

Documentação e correção entre navegadores fornecidos aqui . Um exemplo de seu uso pode ser encontrado em outra das minhas respostas aqui .

Edit : para maior clareza, eu só quero repetir o que foi corretamente afirmado em outras respostas: a ordem das chaves em objects javascript é indefinida.

Uma versão de uma regra:

 var val = example[function() { for (var k in example) return k }()]; 

Não há uma “primeira” propriedade. As chaves de object não são ordenadas.

Se você fizer um loop por (var foo in bar) irá obtê-los em alguma ordem, mas isso pode mudar no futuro (especialmente se você adicionar ou remover outras chaves).

Você também pode fazer Object.values(example)[0] .

Não. Um literal de object, conforme definido pelo MDC, é:

uma lista de zero ou mais pares de nomes de propriedades e valores associados de um object, entre chaves ({}).

Portanto, um literal de object não é uma matriz e você só pode acessar as propriedades usando seu nome explícito ou um loop for usando a palavra-chave in .

Eu não recomendo que você use Object.keys desde que não seja suportado em versões antigas do IE. Mas se você realmente precisa disso, você pode usar o código acima para garantir a compatibilidade de volta:

 if (!Object.keys) { Object.keys = (function () { var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), dontEnums = [ 'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ], dontEnumsLength = dontEnums.length; return function (obj) { if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); var result = []; for (var prop in obj) { if (hasOwnProperty.call(obj, prop)) result.push(prop); } if (hasDontEnumBug) { for (var i=0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); } } return result; }})()}; 

Recurso Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5

Mais informações: https://developer.mozilla.org/pt-BR/docs/JavaScript/Reference/Global_Objects/Object/keys

Mas se você precisar apenas do primeiro, poderíamos providenciar uma solução mais curta como:

 var data = {"key1":"123","key2":"456"}; var first = {}; for(key in data){ if(data.hasOwnProperty(key)){ first.key = key; first.content = data[key]; break; } } console.log(first); // {key:"key",content:"123"} 

Solução com biblioteca lodash :

 _.find(example) // => {name: "foo1"} 

mas não há garantia da ordem de armazenamento interno das propriedades do object porque depende da implementação da VM do javascript.

Isto foi coberto aqui antes.

O conceito de primeiro não se aplica às propriedades do object, e a ordem de um loop for … in não é garantida pelas especificações, no entanto, na prática, é confiável, FIFO, exceto criticamente para chrome ( relatório de bug ). Tome as suas decisões em conformidade.

Se você precisar acessar “a primeira propriedade de um object”, isso pode significar que há algo errado com sua lógica. A ordem das propriedades de um object não deve importar.

Use uma matriz em vez de um object (colchetes).

 var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}]; var fist = example[0]; 

Note que você perde os identificadores ‘foo’. Mas você pode adicionar uma propriedade de nome aos objects contidos:

 var example = [ {name: 'foo1', /* stuff1 */}, {name: 'foo2', /* stuff2 */}, {name: 'foo3', /* stuff3 */} ]; var whatWasFirst = example[0].name; 

Qualquer motivo para não fazer isso?

 > example.map(x => x.name); (3) ["foo1", "foo2", "foo3"]