Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象不可扩展为对象数组创建新属性时出错_Javascript_Reactjs - Fatal编程技术网

Javascript 对象不可扩展为对象数组创建新属性时出错

Javascript 对象不可扩展为对象数组创建新属性时出错,javascript,reactjs,Javascript,Reactjs,我有一个需要扩展javascript数组的函数,包括一个名为selected的新属性: export const initSelect = (data) => { let newData = data.concat(); newData.map((item) => { item.selected = false; }) return newData; } data是一个ReactJS状态值(调用函数时来自this.state.da

我有一个需要扩展javascript数组的函数,包括一个名为
selected
的新属性:

export const initSelect = (data) => {

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

    return newData;
}
data
是一个ReactJS状态值(调用函数时来自
this.state.data
),但这似乎不是问题,因为
newData
data
数组的新副本

我得到以下错误:

TypeError: Cannot add property selected, object is not extensible

您可能需要复制对象:

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

您不能使用
selected
属性扩展
item
,您的数组只是一个浅拷贝

如果您希望能够扩展,则必须对阵列进行深度复制。这可能已经足够了:

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

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

@Jonasw op误用了concat和map。我认为您的解决方案也不应该误用它们。返回的对象会是
数据的副本吗?我将使用return设置ReactJS对象状态……虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。请记住,此代码afaik不是等效的。例如,如果数据已经包含selected:true,那么新对象将以selected:true结束。我在object.assign方法中看到相同的错误。我设法用@Jonas anwer解决了这个问题。那么你可能做错了@RocíoGarcíaLuque,因为根据我对你的理解,Jonas的解决方案和我的是等价的。我记不起当时的情况,但可能是的,我做错了什么。您的解决方案是完全有效的:+1:为了真正理解此错误,这里可能会有所帮助。这似乎是一些不必要的“字符串化”。
数据
中也可能存在无法字符串化的对象,因此会破坏原始数据。
data = JSON.parse(JSON.stringify(data)));