Objekt ist kein erweiterbarer Fehler beim Erstellen eines neuen Attributs für ein Array von Objekten

Lesezeit: 2 Minuten

Benutzeravatar von Mendes
Mendes

Ich habe eine Funktion, die ein Javascript-Array erweitern muss, einschließlich eines neuen Attributs namens selected:

export const initSelect = (data) => {

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

    return newData;
}

data ist ein ReactJS-Zustandswert (kommt von this.state.data beim Aufruf der Funktion), aber das schien kein Problem zu sein newData ist eine neue Kopie von data Reihe…

Ich erhalte den folgenden Fehler:

TypeError: Cannot add property selected, object is not extensible

Benutzeravatar von Jonas Wilms
Jonas Wilms

Wahrscheinlich müssen Sie die Objekte kopieren:

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

  • @Jonasw der Op missbraucht concat und map. Ich denke, Ihre Lösung sollte sie auch nicht missbrauchen.

    – lilezek

    21. August 2017 um 14:06 Uhr


  • Wird das zurückgegebene Objekt eine Kopie von data ? Ich werde die Rückgabe verwenden, um den ReactJS-Objektstatus festzulegen….

    – Mendes

    21. August 2017 um 23:27 Uhr

Benutzeravatar von lilezek
lilezek

Sie können nicht verlängern item mit selected -Eigenschaft, und Ihr Array ist nur eine flache Kopie.

Wenn Sie erweitern möchten, müssen Sie eine tiefe Kopie Ihres Arrays erstellen. Es kann reichen mit:

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

  • Ich sehe den gleichen Fehler beim Object.assign-Ansatz. Ich schaffe es, es mit @Jonas answer zu lösen.

    – Rocío García Luque

    10. September 2018 um 11:01 Uhr

  • Dann machst du wahrscheinlich etwas falsch @RocíoGarcíaLuque, da die Lösung von Jonas und meine nach meinem Verständnis von stackoverflow.com/a/50558264/2832398 gleichwertig sind

    – lilezek

    29. Dezember 2018 um 20:16 Uhr

  • Du hast vollkommen Recht. Ich kann mich nicht an die Situation erinnern, aber wahrscheinlich ja, ich habe etwas falsch gemacht. Ihre Lösung ist vollkommen gültig :+1:

    – Rocío García Luque

    30. Dezember 2018 um 9:55 Uhr

Benutzeravatar von Arul Ganapathy M
Arul Ganapathy M

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

  • Das scheint eine unnötige “Stringifizierung” zu sein. Es könnten sich auch Gegenstände darin befinden data die nicht stringifiziert werden konnten und somit die Originaldaten zerstören.

    – Esben Damgaard

    11. Dezember 2020 um 10:06 Uhr

  • Für mein “nicht schiebbares” Array war dies perfekt

    – Poopy Doop

    24. Juni 2021 um 9:23 Uhr

  • Sie können sich auf lodash.deepClone(data) verlassen, um den Verlust verschachtelter Daten zu vermeiden

    – Iwan Yulin

    27. Juni 2021 um 12:40 Uhr

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

1404020cookie-checkObjekt ist kein erweiterbarer Fehler beim Erstellen eines neuen Attributs für ein Array von Objekten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy