我试图创建一个新的对象数组,向其中添加新的键和值对。我的问题是,由于某种原因,下面的addActive函数更改了参数数组。更加令人困惑的是,即使我向脚本中添加了var itemList = data;
,它仍然通过向其添加一个额外的列来更改了初始data
数组。
从Python的背景来看,对我来说似乎有点不合逻辑,尤其是当文档说map
创建一个新数组时。有人可以解释一下吗?
const data = [{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ age: 38, first_name: 'Jami', last_name: 'Carney' }];
function getFields(df) {
return Object.keys(df[0])
}
var itemList = data;
function addActive(df) {
return itemList.map((o) => {
o.isActive = true;
return o;
})
}
const items = addActive(itemList);
const fields = getFields(data);
console.log(fields)
答案 0 :(得分:3)
.map
创建一个新数组时,其参数是对旧数组中对象的直接引用:
const obj = {};
const arr = [obj];
const newArr = arr.map((item) => {
console.log(item === obj);
});
如果您对这些对象之一进行了突变然后将其返回,则旧数组中的项目也将发生突变。新数组将由与旧数组相同的对象组成,尽管它们是不同的集合。
如果您还想克隆子对象,请改为使用传播语法:
function addActive(df) {
return itemList.map((o) => ({ ...o, isActive: true }));
}
const data = [{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ age: 38, first_name: 'Jami', last_name: 'Carney' }];
function getFields(df) {
return Object.keys(df[0])
}
var itemList = data;
function addActive(df) {
return itemList.map((o) => ({ ...o, isActive: true }));
}
const items = addActive(itemList);
const fields = getFields(data);
console.log(fields)
这将导致新数组项与原始数组项完全分开。