Obtener el primer índice de un objeto

201

Considerar:

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

¿Cómo haría esto?

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

Obviamente, eso no funciona porque se nombra el primer índice foo, no 0.

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

funciona, pero no sé si se llama foo. Podría llamarse cualquier cosa. Solo quiero el primero.

Ryan Florence
fuente

Respuestas:

61

Si el orden de los objetos es significativo, debe revisar su esquema JSON para almacenar los objetos en una matriz:

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

o tal vez:

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

Como señala Ben Alpert, las propiedades de los objetos Javascript están desordenadas, y su código se rompe si espera que se enumeren en el mismo orden en que se especifican en el literal del objeto: no hay una propiedad "primera".

Millas
fuente
66
Nunca he visto para (i en obj) hacer las cosas en un orden diferente, ¿estás diciendo que a veces para (i en obj) echarán las cosas en un orden diferente?
Ryan Florence
44
Es posible que lo haga. Las especificaciones dicen que no tiene que enumerarse en un orden específico. Esto significa que ese orden puede cambiar.
PatrikAkerstrand
55
La mayoría de los navegadores actualmente conservan el orden de inserción, pero ese no siempre fue el caso; no es requerido por la especificación, y hubo versiones recientes de Chrome que no conservaron el orden de inserción.
Millas
1
A medida que profundizaba en lo que estaba haciendo, el orden de las cosas se hizo más importante (pensé que solo me importaba lo primero, ¡pero me equivoqué!), Por lo que fue claro almacenar mis objetos en una matriz, como usted sugirió.
Ryan Florence
1
Si sabe que el objeto tiene un solo elemento, entonces conoce el orden.
danorton
329

Solo por diversión, esto funciona en JS 1.8.5

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

Esto coincide con el mismo orden que verías haciendo

for (o in obj) { ... }
Jacob
fuente
24
Borre la mejor opción a menos que se requiera compatibilidad con palabras clave de la edad de piedra.
Dag Sondre Hansen
1
100% la mejor respuesta. Esta es la forma más fácil y rápida de hacer esto.
Caso del
3
Solo para aclarar, de acuerdo con en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 no es compatible antes de IE9. Lamentablemente, muchas personas todavía están en la edad de piedra.
Noremac
Muy buena. Corto y simple. Gracias @Jacob
Sariban D'Cl
si alguien está usando IE9 feel siento su dolor. gracias esto es increíble
CMS
204

Si quieres algo conciso prueba:

for (first in obj) break;

alert(first);

envuelto como una función:

function first(obj) {
    for (var a in obj) return a;
}
Patrick Hayes
fuente
8
Vea la respuesta de Luke Schafer a continuación, utiliza el método hasOwnProperty para asegurarse de que no tome miembros prototipo.
Code Commander
3
Para que un trazador de líneas funcione en todos los navegadores, incluido IE8 y uso inferior for (var key in obj) if (obj.hasOwnProperty(key)) break;, querrá usar la keyvariable
Ally
no funciona si el primer elemento es un tipo de objeto. devuelve 0
nieve
Object.keys(obj)[0];es mucho más rápido (0.072ms) que for(1.644ms).
Sebastian Ortmann
77

en realidad no están ordenados, pero puedes hacer:

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

el .hasOwnProperty()es importante hacer caso omiso de los objetos de prototipos.

Luke Schafer
fuente
Hay un error en el código anterior. El tipo de verificación debe ser typeof (i)
jacob.toye
@Napalm se refería al error en el nombre de la variable que se verificaba, no a la sintaxis. Tienes razón, pero a muchas personas les gusta el horquillado para facilitar la lectura
Luke Schafer
Gracias. Es asombroso.
Santosh
76

Esto no le dará el primero ya que los objetos de JavaScript no están ordenados, sin embargo, esto está bien en algunos casos.

myObject[Object.keys(myObject)[0]]
Rob Fox
fuente
39

para la primera clave de objeto puede 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
fuente
18

No hay forma de obtener el primer elemento, ya que los "hashes" (objetos) en JavaScript tienen propiedades desordenadas. Su mejor opción es almacenar las claves en una matriz:

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

Luego use eso para obtener el valor adecuado:

object[keys[0]]
Sophie Alpert
fuente
16

ES6

const [first] = Object.keys(obj)
Richard Ayotte
fuente
Funciona, pero ¿puedes explicar cómo funciona? Solo mostrar el código no me hace entenderlo.
Daan
1
Es una tarea desestructuradora . Básicamente, asigna el primer elemento de la matriz devuelta a la variable dentro de los corchetes.
Richard Ayotte
12

Con el guión bajo puede usar _.pairs para obtener la primera entrada de objeto como un par de valores clave de la siguiente manera:

_.pairs(obj)[0]

Entonces la clave estaría disponible con otro [0]subíndice, el valor con[1]

Dexygen
fuente
Funciona mejor cuando se utiliza underscore.js. Justo lo que necesitaba ... ¡Gracias, George!
Goldengalaxy
10

Tuve el mismo problema ayer. Lo resolví así:

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.

No es la solución más elegante, y estoy bastante seguro de que puede producir resultados diferentes en diferentes navegadores (es decir, las especificaciones dicen que no se requiere enumeración para enumerar las propiedades en el mismo orden en que se definieron). Sin embargo, solo tenía una sola propiedad en mi objeto, por lo que no era un problema. Solo necesitaba la primera llave.

PatrikAkerstrand
fuente
1
Hola @PatrikAkerstrand temprano, accidentalmente hice clic en downvote. Realice cualquier cambio en su respuesta para que lo deshaga. Lo siento.
rogeriolino
7

Podrías hacer algo como esto:

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
fuente
6

Para obtener la primera clave de tu objeto

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

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

// result will return 'foo1'
ldls
fuente
¿Cuál es la diferencia de esta respuesta a la de Jacob?
YakovL
da confianza al más reciente que este tipo de código funciona perfectamente.
Santosh
5

Basado en la respuesta de CMS . No obtengo el valor directamente, en cambio tomo la clave en su índice y lo uso para obtener el 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
fuente
2

Mi solución:

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
fuente
12
bonito, solo ... ¡tu estilo de codificación! ¿que demonios? ¡esas llaves están en todas partes!
ovejas voladoras
2
¿Conoces el estilo python? Acabo de agregar llaves alineadas verticalmente al estilo python. De todos modos, "El infierno es otra gente", :-D
diyism