¿Cómo acceder a la primera propiedad de un objeto Javascript?

717

¿Existe una forma elegante de acceder a la primera propiedad de un objeto ...

  1. donde no sabe el nombre de sus propiedades
  2. sin usar un bucle como el de for .. injQuery$.each

Por ejemplo, necesito acceder al foo1objeto sin saber el nombre de foo1:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};
1
  • 1
    probablemente sea mejor transformarlo en una matriz primerocregox 24 de marzo de 2017 a las 14:32
1594
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

Usando esto puede acceder también a otras propiedades por índices. ¡Ten cuidado! Object.keysEl pedido de devolución no está garantizado según ECMAScript; sin embargo, extraoficialmente lo es por todas las implementaciones de los principales navegadores, lea https://stackoverflow.com/a/23202095 para obtener detalles al respecto.

11
  • 28
    Dices que no es la forma más rápida. ¿De qué manera sería más rápido? T Nguyen 6 de septiembre de 2013 a las 14:19
  • 6
    Esto no es muy eficiente ya que crea una matriz completa de todas las claves del objeto. Andrew Mao 29 de enero de 2014 a las 5:23
  • 9
    @T Nguyen Lo publicaría si lo supiera :)Grzegorz Kaczan 4 feb 14 a las 21:13
  • 7
    @DavChana: configuró mal su punto de referencia. El bloque repetitivo siempre se ejecutará y su bloque 2 estaba vacío, lo que significa que el primer resultado representa la ejecución repetitiva + bloque1 , y el segundo resultado representa solo el modelo repetitivo . Aquí está el punto de referencia correcto: http://jsben.ch/#/R9aLQ , que muestra que son prácticamente iguales (ejecute la prueba varias veces). myfunkyside 12/11/2016 a las 14:06
  • 20
    Ojalá first()o algo similar pudiera manejar esto. Fr0zenFyr 6 de diciembre de 2016 a las 7:18
132

Prueba el for … inciclo y rompe después de la primera iteración:

for (var prop in object) {
    // object[prop]
    break;
}
4
  • 1
    Creo que esta es la única opción. Sin embargo, no estoy seguro de que tenga la garantía de que las propiedades se iterarán en un orden predecible / útil. Es decir, puede tener la intención de foo1 pero obtener foo3. Si las propiedades están numeradas como en el ejemplo, puede hacer una comparación de cadenas para determinar el identificador que termina en '1'. Por otra parte, si la ordinalidad es la principal preocupación de la colección, probablemente debería usar una matriz en lugar de un objeto. steamer25 11/06/09 a las 20:13
  • 2
    Si alguien más está preocupado por el orden, la mayoría de los navegadores se comportan de manera predecible: stackoverflow.com/questions/280713/…Flash 4 de febrero de 2013 a las 5:39
  • 8
    var prop; para (apoyo en objeto) descanso; // objeto [prop]netiul 5 de junio de 2014 a las 13:16
  • 14
    Respuesta antigua pero. Es posible que desee comprobar si la propiedad pertenece al objeto. como: para (..) {if (! obj.hasOwnProperty (prop)) continuar; .... rotura; } en caso de que el objeto esté realmente vacío, no atraviesa el prototipo o algo así. pgarciacamou 12/09/2014 a las 21:24
103

También puedes hacerlo Object.values(example)[0].

3
48

Úselo Object.keyspara obtener una matriz de las propiedades de 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)

La documentación y la corrección entre navegadores se proporcionan aquí . Un ejemplo de su uso se puede encontrar en otra de mis respuestas aquí .

Editar : para mayor claridad, solo quiero hacerme eco de lo que se dijo correctamente en otras respuestas: el orden de las teclas en los objetos de JavaScript no está definido.

24

No hay una propiedad "primera". Las claves de objeto están desordenadas.

Si los recorre con for (var foo in bar), los obtendrá en algún orden, pero puede cambiar en el futuro (especialmente si agrega o elimina otras claves).

2
  • Impresionante. He estado usando un objeto para implementar un mapa que mantiene el orden de inserción. Eso se rompe una vez que elimino un valor porque la siguiente inserción llena el espacio. :(David Harkness 29 de mayo de 2012 a las 18:00
  • 2
    El orden clave / valor debe conservarse en las versiones más recientes de JSAlexander Mills 17 de diciembre de 2016 a las 3:10
24

Una versión de una sola regla:

var val = example[function() { for (var k in example) return k }()];
1
  • 2
    A veces, puede ser arriesgado usarlo for insin verificar, hasOwnPropertyya que el objeto contiene otros valores no deseados agregados a él de manera programática, por lo que podría terminar obteniendo un resultado no deseado de este fragmento. El hecho de que sea corto y ordenado no significa que sea seguro y óptimo. Javier Cobos 11/07/18 a las 6:37
11

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

3
  • 2
    Solo probé esto y no funciona. Devuelve solo el valor, no el par clave / valor. Chris Haines 18 de septiembre de 2017 a las 12:40
  • 2
    No se menciona en la pregunta que debería devolver el par clave / valor, solo pide el objeto y la respuesta aceptada hace tanto como esta función lodash: devuelve el contenido de la primera propiedad. Puede que no se adapte a sus necesidades específicas, pero esta respuesta ES correcta según la pregunta original. Carrm 30 nov 2018 a las 10:10
  • Sí, funciona, útil cuando sabe que su objeto solo tendrá un objeto secundariovar object = { childIndex: { .. } }; var childObject = _.find(Object);Raja Khoury 12/04/19 a las 20:11
11

La respuesta superior podría generar toda la matriz y luego capturar de la lista. Aquí hay otro atajo efectivo

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal
8

No. Un objeto literal, tal como lo define MDC, es:

a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}).

Por lo tanto, un objeto literal no es una matriz y solo puede acceder a las propiedades usando su nombre explícito o un forbucle usando la inpalabra clave.

1
  • 26
    Para otros que solo ven la marca verde en esta respuesta, hay otra solución más abajo en la página con actualmente 350 votos a favor. redfox05 13/11/15 a las 10:12
7

Aquí hay una forma más limpia de obtener la primera clave:

var object = {
    foo1: 'value of the first property "foo1"',
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

let [firstKey] = Object.keys(object)

console.log(firstKey)
console.log(object[firstKey])
2
  • Pero por qué la matriz alrededor [first]. El usuario no solicitó una matriz como respuesta. ¿Por qué hacer esto sobre first = Object.keys(example)[0]cuál hará lo mismo sin necesidad de envolver la respuesta en una matriz? ¿Por qué el tuyo está más limpio, por favor? Michael Durrant 27 abr.20 a las 11:46
  • Esa es una asignación de desestructuración developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Ntiyiso Rikhotso 28 abr.20 a las 7:44
6

Puede utilizar Object.values ​​() para acceder a los valores de un objeto:

var obj = { first: 'someVal' };
Object.values(obj)[0]; // someVal
1
  • La forma más sencilla y fácil de hacer estoFrederiko Cesar 26 de julio a las 9:39
4

Para obtener el primer nombre de clave en el objeto, puede usar:

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

Devuelve una cadena, por lo que no puede acceder a objetos anidados si los hubiera, como:

var obj = { first: { someVal : { id : 1} }; Aquí, con esa solución, no puede acceder a id.

La mejor solución si desea obtener el objeto real es usar lodash como:

obj[_.first(_.keys(obj))].id

Para devolver el valor de la primera clave, (si no sabe exactamente el nombre de la primera clave):

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

si conoce el nombre de la clave, simplemente use:

obj.first

o

obj['first']
3

Esto se ha cubierto aquí antes.

El concepto de primero no se aplica a las propiedades del objeto, y el orden de un bucle for ... in no está garantizado por las especificaciones, sin embargo, en la práctica es FIFO confiable, excepto críticamente para Chrome ( informe de error ). Tome sus decisiones en consecuencia.

3

No te recomiendo que uses Object.keys ya que no es compatible con versiones antiguas de IE. Pero si realmente lo necesita, puede usar el código anterior 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 el primero, 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"}
3

si alguien prefiere la desestructuración de matrices

const [firstKey] = Object.keys(object);
0

Si necesita acceder a "la primera propiedad de un objeto", puede significar que hay algo mal en su lógica. El orden de las propiedades de un objeto no debería importar.

1
  • Tienes razón. No necesito la primera, per se, sino solo una de las propiedades de foo para poder trabajar con ella. Solo necesito uno y no estaba seguro de si había una manera de agarrar el "primero" sin usar para ... in.atogle 11 jun 09 a las 20:15
0

Puede usar Object.prototype.keysque devuelve todas las claves de un objeto en el mismo orden. Entonces, si desea el primer objeto, obtenga esa matriz y use el primer elemento como clave deseada.

const o = { "key1": "value1", "key2": "value2"};
const idx = 0; // add the index for which you want value
var key = Object.keys(o)[idx];
value = o[key]
console.log(key,value); // key2 value2
1
  • 1
    Al responder una pregunta anterior, su respuesta sería mucho más útil para otros usuarios de StackOverflow si incluyera algún contexto para explicar cómo ayuda su respuesta, particularmente para una pregunta que ya tiene una respuesta aceptada. Ver: ¿Cómo escribo una buena respuesta ? David Buck 2 dic 2019 a las 12:30
0

también podemos hacer con este enfoque.

var example = {
  foo1: { /* stuff1 */},
  foo2: { /* stuff2 */},
  foo3: { /* stuff3 */}
}; 
Object.entries(example)[0][1];
-1

¿Alguna razón para no hacer esto?

> example.map(x => x.name);

(3) ["foo1", "foo2", "foo3"]
1
-1

Como han señalado otros, si el orden de las propiedades es importante, almacenarlas en un objeto no es una buena idea. En su lugar, debe utilizar una matriz mediante corchetes. P.ej,

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

Tenga en cuenta que pierde los identificadores 'foo'. Pero puede 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;

Para aquellos que buscan una respuesta a una pregunta similar, a saber: "¿Cómo encuentro una o más propiedades que coinciden con un patrón determinado?", Les recomiendo usar Object.keys(). Para extender la respuesta de benekastah:

for (const propName of Object.keys(example)) {
  if (propName.startsWith('foo')) {
    console.log(`Found propName ${propName} with value ${example[propName]}`);
    break;
  }
}
2
  • hay situaciones en las que no podemos. Suponemos que no podemos cambiar el hecho de que no están en una matriz1mike12 31/07/2016 a las 19:33
  • 1
    Creo que es útil retrasar un poco el diseño para los lectores que pueden controlar su esquema JSON. Básicamente, estoy ampliando la respuesta de Flavius ​​Stef con algunos ejemplos. steamer25 15/08/16 a las 19:36