- 需求:将原数组中每条数据对象的键更名
- 实现:
let oldList = [
{oldName: '张三', oldAge: '30'},
{oldName: '李四', oldAge: '35'}
];
let newList = [];
let map = {};
oldList.forEach((item) => {
map['newName'] = item.oldName;
map['newAge'] = item.oldAge;
newList.push(map);
});
// newList 出现了重复 oldList 最后一条数据的情况
// [
// {newName: "李四", newAge: "35"},
// {newName: "李四", newAge: "35"}
// ]
// 这次在遍历过程中打印一下 map 看一看
oldList.forEach((item) => {
map['newName'] = item.oldName;
map['newAge'] = item.oldAge;
newList.push(map);
console.log(map);
});

// 解决的方法:改变 map 声明的位置
// let map = {};
oldList.forEach((item) => {
let map = {}; // 修改后将 map 的声明拿进来
map['newName'] = item.oldName;
map['newAge'] = item.oldAge;
newList.push(map);
});
// [
// {newName: "张三", newAge: "30"},
// {newName: "李四", newAge: "35"}
// ]
这里出现这个问题的原因是map
是指向{}
的指针,真正被改变的不是map
而是内存中map
指向的位置也就是{}
,因此map
在遍历前声明的话就会导致所有的newList
数据都指向这个只声明了一次的map
,然后这个唯一的map
指向了在内存中唯一的{}
。
map | newList |
---|---|
{newName: "李四", newAge: "35"} | {newName: "李四", newAge: "35"} |
- | {newName: "李四", newAge: "35"} |
- | {newName: "李四", newAge: "35"} |
- | {newName: "李四", newAge: "35"} |
因此需要每次遍历就声明一次map
,这样就可以在内存中开辟一个新的map
作为指向新{}
的唯一指针,而不是所有的newList
数据都指向一个{}
。
map | newList |
---|---|
{newName: "张三", newAge: "30"} | {newName: "张三", newAge: "30"} |
{newName: "李四", newAge: "35"} | {newName: "李四", newAge: "35"} |
网友评论