objetos - ¿Cómo acceder a la primera propiedad de un objeto en Javascript?
prototype javascript ejemplos (13)
¿Existe una manera elegante de acceder a la primera propiedad de un objeto ...
- donde no sabes el nombre de tus propiedades
- sin usar un bucle como
for .. in
o jQuery''s$.each
Por ejemplo, necesito acceder al objeto foo1
sin saber el nombre de foo1:
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
¿Alguna razón para no hacer esto?
> example.map(x => x.name);
(3) ["foo1", "foo2", "foo3"]
Esto ha sido cubierto aquí antes.
El concepto de primero no se aplica a las propiedades del objeto, y el orden de un ciclo de for ... in no está garantizado por las especificaciones, sin embargo, en la práctica es fiable FIFO, excepto en el caso de Chrome ( informe de error ). Tome sus decisiones en consecuencia.
No hay una "primera" propiedad. Las claves de objeto están desordenadas.
Si los recorres con for (var foo in bar)
, los obtendrás en algún orden, pero puede cambiar en el futuro (especialmente si agregas o eliminas otras claves).
No te recomiendo que uses Object.keys, ya que no es compatible con versiones anteriores de IE. Pero si realmente lo necesita, puede usar el código de arriba para garantizar la compatibilidad con versiones anteriores:
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;
}})()};
Característica Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5
Más información: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Pero si solo necesita la primera, podríamos organizar una solución más corta 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"}
No. Un literal de objeto, como lo define MDC es:
una lista de cero o más pares de nombres de propiedades y valores asociados de un objeto, encerrados entre llaves ({}).
Por lo tanto, un objeto literal no es una matriz, y solo puede acceder a las propiedades usando su nombre explícito o un bucle for
usando la palabra clave in
.
Pruebe el for … in
loop y break después de la primera iteración:
for (var prop in object) {
// object[prop]
break;
}
Si necesita acceder a "la primera propiedad de un objeto", puede significar que hay algo mal con su lógica. El orden de las propiedades de un objeto no debería importar.
Solución con biblioteca lodash :
_.find(example) // => {name: "foo1"}
pero no hay garantía del orden de almacenamiento interno de las propiedades del objeto porque depende de la implementación de la máquina virtual de JavaScript.
También puede hacer Object.values(example)[0]
.
Una versión de una regla:
var val = example[function() { for (var k in example) return k }()];
Utilice Object.keys
para obtener una matriz de las propiedades en un objeto. Ejemplo:
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)
Documentación y calza de navegador cruzada here . Un ejemplo de su uso se puede encontrar en otra de mis respuestas here .
Edición : para mayor claridad, solo quiero repetir lo que se indicó correctamente en otras respuestas: el orden de las teclas en los objetos de JavaScript no está definido.
Utilice una matriz en lugar de un objeto (corchetes).
var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];
Tenga en cuenta que pierde los identificadores ''foo''. Pero podría agregar una propiedad de nombre a los objetos contenidos:
var example = [
{name: ''foo1'', /* stuff1 */},
{name: ''foo2'', /* stuff2 */},
{name: ''foo3'', /* stuff3 */}
];
var whatWasFirst = example[0].name;
var obj = { first: ''someVal'' };
obj[Object.keys(obj)[0]]; //returns ''someVal''
Usando esto puedes acceder también a otras propiedades por índices. ¡Ten cuidado aunque! Object.keys
orden de devolución de Object.keys
no está garantizada según ECMAScript, sin embargo, de manera no oficial, lo hacen todas las implementaciones de los principales navegadores, lea https://.com/a/23202095 para obtener detalles sobre esto.