objetos - recorrer objeto json javascript
Creando objeto con claves dinĂ¡micas (2)
Esta pregunta ya tiene una respuesta aquí:
En primer lugar, estoy usando Cheerio para acceder a DOM y analizar Node.js. Buenos tiempos.
Heres la situación:
Tengo una función que necesito para crear un objeto. Ese objeto usa variables tanto para sus claves como para sus valores, y luego devuelve ese único objeto. Ejemplo:
stuff = function (thing, callback) {
var inputs = $(''div.quantity > input'').map(function(){
var key = this.attr(''name'')
, value = this.attr(''value'');
return { key : value }
})
callback(null, inputs);
}
Produce esto:
[ { key: ''1'' }, { key: ''1'' } ]
( .map()
devuelve una matriz de objetos fyi)
Necesito la key
para ser la cadena de this.attr(''name'')
.
¿Cuál es la mejor manera de asignar una cadena como clave en Javascript, considerando lo que estoy tratando de hacer?
En el nuevo estándar ES2015 para JavaScript (anteriormente llamado ES6), los objetos se pueden crear con claves computadas : Especificación de inicializador de objetos .
La sintaxis es:
var obj = {
[myKey]: value,
}
Si se aplica al escenario del OP, se convertiría en:
stuff = function (thing, callback) {
var inputs = $(''div.quantity > input'').map(function(){
return {
[this.attr(''name'')]: this.attr(''value''),
};
})
callback(null, inputs);
}
Nota: Todavía se requiere un transpiler para la compatibilidad del navegador .
Al usar Babel o el traceur de Google , es posible usar esta sintaxis hoy .
En las especificaciones de JavaScript anteriores (ES5 e inferior), la clave en un objeto literal siempre se interpreta literalmente, como una cadena.
Para usar una tecla "dinámica", tienes que usar la notación de corchete :
var obj = {};
obj[myKey] = value;
En tu caso:
stuff = function (thing, callback) {
var inputs = $(''div.quantity > input'').map(function(){
var key = this.attr(''name'')
, value = this.attr(''value'')
, ret = {};
ret[key] = value;
return ret;
})
callback(null, inputs);
}
No puede definir un objeto literal con una clave dinámica. Hacer esto :
var o = {};
o[key] = value;
return o;
No hay acceso directo (edición: ahora hay uno, con ES6, vea la otra respuesta).