Javascript 映射数组对象在尝试添加时更改原始数组 属性
Javascript Map Array Object changes original array when try to add property
我映射对象数组并尝试添加 属性 和 return 新数组并记录它。但事实证明它也改变了原始数组......为什么会这样?我相信这是某种对象技巧。
var students = [
{ name: 'nika', age: 25 },
{ name: 'goga', age: 11 },
{ name: 'saba', age: 20 },
{ name: 'tedo', age: 35 },
{ name: 'gio', age: 15 },
{ name: 'lasha', age: 5 },
{ name: 'sandro', age: 8 },
];
function solution(arr) {
let newArr = arr.map(function (item) {
if (item.age < 18) {
item.forbidden = true;
}
return item;
});
console.log(newArr);
console.log(students);
}
solution(students);
我想要 ES5 中的解决方案
您可以从不共享相同对象引用的对象创建副本。
function solution(arr) {
return arr.map(function (item) {
item = JSON.parse(JSON.stringify(item));
if (item.age < 18) {
item.forbidden = true;
}
return item;
});
}
var students = [
{ name: 'nika', age: 25 },
{ name: 'goga', age: 11 },
{ name: 'saba', age: 20 },
{ name: 'tedo', age: 35 },
{ name: 'gio', age: 15 },
{ name: 'lasha', age: 5 },
{ name: 'sandro', age: 8 },
];
console.log(solution(students));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz 正确地指出解决方案是在 map 方法的函数内创建每个对象的副本,并暗示为什么这是必要的:map 方法正在创建一个新的对象数组,但这些对象与原始数组中的对象共享相同的引用。因此,对对象所做的任何更改都会反映在两个数组中。
我映射对象数组并尝试添加 属性 和 return 新数组并记录它。但事实证明它也改变了原始数组......为什么会这样?我相信这是某种对象技巧。
var students = [
{ name: 'nika', age: 25 },
{ name: 'goga', age: 11 },
{ name: 'saba', age: 20 },
{ name: 'tedo', age: 35 },
{ name: 'gio', age: 15 },
{ name: 'lasha', age: 5 },
{ name: 'sandro', age: 8 },
];
function solution(arr) {
let newArr = arr.map(function (item) {
if (item.age < 18) {
item.forbidden = true;
}
return item;
});
console.log(newArr);
console.log(students);
}
solution(students);
我想要 ES5 中的解决方案
您可以从不共享相同对象引用的对象创建副本。
function solution(arr) {
return arr.map(function (item) {
item = JSON.parse(JSON.stringify(item));
if (item.age < 18) {
item.forbidden = true;
}
return item;
});
}
var students = [
{ name: 'nika', age: 25 },
{ name: 'goga', age: 11 },
{ name: 'saba', age: 20 },
{ name: 'tedo', age: 35 },
{ name: 'gio', age: 15 },
{ name: 'lasha', age: 5 },
{ name: 'sandro', age: 8 },
];
console.log(solution(students));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz 正确地指出解决方案是在 map 方法的函数内创建每个对象的副本,并暗示为什么这是必要的:map 方法正在创建一个新的对象数组,但这些对象与原始数组中的对象共享相同的引用。因此,对对象所做的任何更改都会反映在两个数组中。