Object is not extensible error when creating new attribute for array of objects

152,028

Solution 1

You probably need to copy the objects:

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

Solution 2

You can not extend item with selected property, and your array is just a shallow copy.

If you want to be able to extend, you will have to do a deep copy of your array. It may be enough with:

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

Solution 3

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

Solution 4

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

Share:
152,028
Mendes
Author by

Mendes

BY DAY: Working hard to turn ideas into borderline software BY NIGHT: Family, fun, barbecue and rockn´roll - go to sleep and brand new ideas again... C++, Javascript, MEAN, ReactJs, Relay and naturally C++ (never missing it) Forerunner into future.... http://stackrating.com/badge/Mendes

Updated on June 02, 2020

Comments

  • Mendes
    Mendes about 4 years

    I have a function that needs to extend a javascript array, including a new attribute called selected:

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

    data is a ReactJS state value (comes from this.state.data when calling the function), but this didn't seem to be a problem as newData is a new copy of data array...

    I'm getting the following error:

    TypeError: Cannot add property selected, object is not extensible