Mi objeto es algo como:
let items = [ { "creationTimeStamp": "2022-05-31T17:04:28.000Z", "modifiedTimeStamp": "2022-05-31T17:04:28.000Z", "locations": [ { "id": "5ao", "name": "Store1" } ], "typeId": "Lead" } ] Estoy tratando de insertar el siguiente objeto en la propiedad de locations :
{ "id": "9a0", "name": "Store2" }he intentado hacer
items1 = []; for (var i = 0; i < items.length; i++) { items1.id = "9a0"; items1.name = "Store2"; //9 is some static index value added Object.assign({9 : items1}, items[i].locations); } Si me console(Object.assign({9 : items1}, items[i].locations)); Puedo ver 2 matrices dentro de él, pero la propiedad de locations de mis elementos sigue siendo la misma.
Mi expectativa es la siguiente:
[ { "creationTimeStamp": "2022-05-31T17:04:28.000Z", "modifiedTimeStamp": "2022-05-31T17:04:28.000Z", "locations": [ { "id": "5ao", "name": "Store1" }, { "id": "9a0", "name": "Store2" } ], "typeId": "Lead" } ] También intenté usar items[i].locations.push(item1) pero luego obtuve:
TypeError: no se puede agregar la propiedad 9, el objeto no es extensible
También traté de asignar una nueva matriz a items[i].locations , pero luego obtuve:
TypeError: no se puede asignar a la propiedad de solo lectura 'ubicaciones' del objeto '#'
¿Qué puedo hacer para obtener el resultado deseado?
Parece esperar que el segundo argumento dado a Object.assign sea mutado. Pero es el primer argumento el que está mutado. Eso significa que sus .locations no están mutadas. Además, en los comentarios, indica que locations no se pueden ampliar y que la propiedad es de solo lectura.
Eso significa que necesitará un objeto completamente nuevo.
Algunas otras observaciones:
No inicialice items1 como una matriz, ya que se supone que es un objeto simple.
Declare una variable con const , let o var y evite la declaración global implícita.
Es más seguro declarar el objeto items1 dentro del bucle, por lo que crea un nuevo objeto cada vez y no muta el mismo objeto. Para su código de ejemplo, no hace ninguna diferencia, pero puede provocar un comportamiento inesperado.
Como no necesita i para nada más que items[i] , y en realidad necesita una estructura completamente nueva, use .map en su lugar.
Asi que:
items = items.map(item => { let obj = { id: "9a0", name: "Store2" }; return {...item, locations: item.locations.concat(obj) }; });Siempre pienso en términos de funciones y de inmutabilidad predeterminada, por lo que mi enfoque podría verse así, con addLocationToAll construido sobre un addLocation más simple. El código es bastante simple:
const addLocation = (newLoc) => ({locations, ...rest}) => ({...rest, locations: locations .concat (newLoc)}) const addLocationToAll = (newLoc) => (items) => items .map (addLocation (newLoc)) const items = [{creationTimeStamp: "2022-05-31T17:04:28.000Z", modifiedTimeStamp: "2022-05-31T17:04:28.000Z", locations: [{id: "5ao", name: "Store1"}], typeId:"Lead"}] const newLoc = {id: "9a0", name: "Store2"} console .log (addLocationToAll (newLoc) (items)) .as-console-wrapper {max-height: 100% !important; top: 0}items es una matriz por lo que debe acceder a la primera posición de la matriz, que sería el objeto propuesto. Con esto, del objeto propuesto, extraerá el atributo de location y, como se trata de una matriz, utilizará la función de inserción para insertar el nuevo objeto.
items[0] // -> // { // creationTimeStamp: '2022-05-31T17:04:28.000Z', // modifiedTimeStamp: '2022-05-31T17:04:28.000Z', // locations: [ { id: '5ao', name: 'Store1' } ], // typeId: 'Lead' // }Intento esto:
items[0].locations.push({"id": "9a0", "name": "Store2" })Y ahora:
items[0] //-> // { // creationTimeStamp: '2022-05-31T17:04:28.000Z', // modifiedTimeStamp: '2022-05-31T17:04:28.000Z', // locations: [ { id: '5ao', name: 'Store1' }, { id: '9a0', name: 'Store2' }], // typeId: 'Lead' // }