metodos - recorrer array de objetos javascript
¿Agregar una propiedad a un objeto de JavaScript usando una variable como nombre? (10)
Estoy extrayendo elementos del DOM con jQuery y quiero establecer una propiedad en un objeto utilizando el id
del elemento DOM.
Ejemplo
const obj = {}
jQuery(itemsFromDom).each(function() {
const element = jQuery(this)
const name = element.attr(''id'')
const value = element.attr(''value'')
// Here is the problem
obj.name = value
})
Si itemsFromDom
incluye un elemento con un id
de "myId", quiero que obj
tenga una propiedad llamada "myId". Lo de arriba me da name
.
¿Cómo nombro una propiedad de un objeto usando una variable usando JavaScript?
Basado en la respuesta de wOxxOm , este es un ejemplo de uso:
const data = [
{"id": "z1", "val":10},
{"id": "z2", "val":20},
{"id": "z3", "val":30}
];
const obj = Object.assign.apply({}, data.map((el, i) => ({[el.id]: el.val})));
console.log(obj);
Con ECMAScript 2015 puede hacerlo directamente en la declaración de objetos utilizando la notación de corchetes:
var obj = {
[key]: value
}
Donde key
puede ser cualquier tipo de expresión (por ejemplo, una variable) que devuelve un valor:
var obj = {
[''hello'']: ''World'',
[x + 2]: 42,
[someObject.getId()]: someVar
}
Con la llegada de ES2015 Object.assign y los nombres de propiedades calculados, el código del OP se reduce a:
var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));
Con lodash, puedes crear un nuevo objeto como este _.set :
obj = _.set({}, key, val);
O puede establecer un objeto existente como este:
var existingObj = { a: 1 };
_.set(existingObj, ''a'', 5); // existingObj will be: { a: 5 }
Debería tener cuidado si desea usar un punto (".") En su ruta, porque lodash puede establecer una jerarquía, por ejemplo:
_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }
Hay dos notaciones diferentes para acceder a las propiedades de los objetos.
- Notación de puntos : myObj.prop1
- Notación del corchete : myObj ["prop1"]
La notación de puntos es rápida y fácil, pero debe usar el nombre de la propiedad real explícitamente. Sin sustitución, variables, etc.
La notación de corchete está abierta. Utiliza una cadena pero puede producir la cadena usando cualquier código js legal. Puede especificar la cadena como literal (aunque en este caso la notación de puntos sería más fácil) o usar una variable o calcular de alguna manera.
Entonces, todos estos configuran la propiedad myObj llamada prop1 al valor Hola :
// quick easy-on-the-eye dot notation
myObj.prop1 = "Hello";
// brackets+literal
myObj["prop1"] = "Hello";
// using a variable
var x = "prop1";
myObj[x] = "Hello";
// calculate the accessor string in some weird way
var numList = [0,1,2];
myObj[ "prop" + numList[1] ] = "Hello";
Escollos:
myObj.[xxxx] = "Hello"; // wrong: mixed notations, syntax fail
myObj[prop1] = "Hello"; // wrong: this expects a variable called prop1
tl; dnr : si desea calcular o hacer referencia a la clave, debe usar la notación de corchete . Si está usando la clave explícitamente, entonces use la notación de puntos para un simple código simple.
Nota: hay algunas otras respuestas buenas y correctas, pero personalmente las encontré un poco breves debido a una baja familiaridad con la peculiaridad de JS sobre la marcha. Esto podría ser útil para algunas personas.
Incluso puedes hacer una lista de objetos como este.
var feeTypeList = [];
$(''#feeTypeTable > tbody > tr'').each(function (i, el) {
var feeType = {};
var $ID = $(this).find("input[id^=txtFeeType]").attr(''id'');
feeType["feeTypeID"] = $(''#ddlTerm'').val();
feeType["feeTypeName"] = $(''#ddlProgram'').val();
feeType["feeTypeDescription"] = $(''#ddlBatch'').val();
feeTypeList.push(feeType);
});
Primero debemos definir la clave como variable y luego debemos asignar la clave como objeto. Por ejemplo
var data = {key:''dynamic_key'',value:''dynamic_value''}
var key = data.key;
var obj = { [key]: data.value}
console.log(obj)
Puedes usar esta sintaxis equivalente:
obj[name] = value
Si desea agregar campos a un objeto dinámicamente, la forma más sencilla de hacerlo es la siguiente:
var params= [
{key: "k1", value=1},
{key: "k2", value=2},
{key: "k3", value=3}];
for(i=0; i< params.len; i++) {
data[params[i].key] = params[i].value
}
Esto creará un objeto de datos que tiene los siguientes campos:
{k1:1, k2:2, k3:3}
objectname.newProperty = value;