Javascript 对象不可扩展为对象数组创建新属性时出错
我有一个需要扩展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
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)));