Traté de hacer cosas básicas. Tengo una matriz que contiene varios objetos. Quiero agregar un nuevo par clave-valor en cada objeto de matriz.
Intenté esto siguiendo el código.
exports.addBuyOption = (arr) => { var newArr=arr; return new Promise((resolve, reject) => { for (let i = 0; i < newArr.length; i++) { newArr[i].name="new name" //updating the existing key value newArr[i].canBuy=true //new key value } setTimeout(() => { resolve(newArr); }, 2000) }) }Agregué el tiempo de espera establecido porque solo quería confirmar si la promesa regresó después de la operación de bucle o no. Además, cuando el código no se ejecuta con la matriz de origen, creo una nueva variable con el nombre newArr pero el código tampoco funciona.
exports.addBuyOption = (arr) => { return new Promise((resolve, reject) => { for (let i = 0; i < arr.length; i++) { arr[i].name="new name" //updating the existing key value arr[i].canBuy=true //new key value } resolve(arr); }) }Con este código, pude actualizar mi valor clave existente, pero no pude agregar ningún valor clave nuevo. ¿Qué estoy haciendo mal? Traté de cambiar el método de agregar clave del operador de punto a la indexación de matriz a Object.assign pero ninguno de ellos funcionó para mí.
Con este código, pude actualizar mi valor clave existente, pero no pude agregar ningún valor clave nuevo.
La única explicación para eso sería que a los objetos en la matriz se les haya aplicado Object.preventExtensions . Aquí hay un ejemplo:
function addBuyOption(arr) { for (let i = 0; i < arr.length; i++) { arr[i].name="new name" //updating the existing key value arr[i].canBuy=true //new key value } return arr; } const arr = [ {name: "old name 1"}, {name: "old name 2"}, {name: "old name 3"}, ].map(Object.preventExtensions); console.log("Before:"); console.log(JSON.stringify(arr, null, 4)); addBuyOption(arr); console.log("After:"); console.log(JSON.stringify(arr, null, 4)); .as-console-wrapper { max-height: 100% !important; }(Tenga en cuenta que eliminé la promesa, no hace nada útil en este código).
Si eso es lo que está pasando, no puede agregar propiedades a los objetos. Pero puede crear una nueva matriz con copias de los objetos con la nueva propiedad:
function addBuyOption(arr) { return arr.map(obj => ({ ...obj, // Copy existing properties name: "new name", // Set new value for existing property canBuy: true, // Set new property })); } const arr = [ {id: 1, name: "old name 1"}, {id: 2, name: "old name 2"}, {id: 3, name: "old name 3"}, ].map(Object.preventExtensions); console.log("Before:"); console.log(JSON.stringify(arr, null, 4)); const newArr = addBuyOption(arr); console.log("After:"); console.log(JSON.stringify(newArr, null, 4)); .as-console-wrapper { max-height: 100% !important; }