El objeto no es un error extensible al crear un nuevo atributo para una matriz de objetos

2 minutos de lectura

avatar de usuario
Mendes

Tengo una función que necesita extender una matriz de javascript, incluido un nuevo atributo llamado selected:

export const initSelect = (data) => {

    let newData = data.concat();
    newData.map((item) => {
        item.selected = false;
    })

    return newData;
}

data es un valor de estado de ReactJS (proviene de this.state.data al llamar a la función), pero esto no parecía ser un problema ya que newData es una nueva copia de data formación…

Recibo el siguiente error:

TypeError: Cannot add property selected, object is not extensible

avatar de usuario
jonas wilms

Probablemente necesites copiar los objetos:

export const initSelect = (data) => {
 return data.map((item) => ({
     ...item,
     selected: false       
 }));
}

  • @Jonasw el operador está haciendo un mal uso de concat y map. Creo que su solución no debería ser un mal uso de ellos también.

    – Lilezek

    21 de agosto de 2017 a las 14:06


  • ¿El objeto devuelto será una copia de data ? Usaré el retorno para establecer el estado del objeto ReactJS….

    – Mendes

    21 de agosto de 2017 a las 23:27

avatar de usuario
Lilezek

no puedes extender item con selected propiedad, y su matriz es solo una copia superficial.

Si desea poder extender, tendrá que hacer una copia profunda de su matriz. Puede ser suficiente con:

let newData = data.map((item) => 
    Object.assign({}, item, {selected:false})
)

  • Veo el mismo error con el enfoque Object.assign. Logré resolverlo usando la respuesta de @Jonas.

    – Rocío García Luque

    10 de septiembre de 2018 a las 11:01

  • Entonces probablemente estés haciendo algo mal @RocíoGarcíaLuque, ya que la solución de Jonas y la mía son equivalentes según mi entendimiento de stackoverflow.com/a/50558264/2832398

    – Lilezek

    29 de diciembre de 2018 a las 20:16

  • Tienes toda la razón. No puedo recordar la situación, pero probablemente sí, estaba haciendo algo mal. Tu solución es perfectamente válida :+1:

    – Rocío García Luque

    30 de diciembre de 2018 a las 9:55

avatar de usuario
Arul Ganapatía M

data = JSON.parse(JSON.stringify(data));

  • Eso parece una “stringificación” innecesaria. También podría haber objetos en data que no pudo ser encadenado y por lo tanto destruir los datos originales.

    –Esben Damgaard

    11 de diciembre de 2020 a las 10:06

  • para mi matriz “imposible de empujar”, esto fue perfecto

    – Poopy Doop

    24 de junio de 2021 a las 9:23

  • puede confiar en lodash.deepClone(data) para evitar la pérdida de datos anidados

    – Iván Yulin

    27 de junio de 2021 a las 12:40

const newObj = Object.assign({selected: false}, data);

¿Ha sido útil esta solución?