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.

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


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) { ... }

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

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.


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]]

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

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]]


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]


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.


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

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'

¿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'

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.