为什么map函数会更改参数数组?

时间:2020-04-15 13:38:24

标签: javascript arrays dictionary

我试图创建一个新的对象数组,向其中添加新的键和值对。我的问题是,由于某种原因,下面的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)

1 个答案:

答案 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)

这将导致新数组项与原始数组项完全分开。