【发布时间】:2016-03-24 17:10:53
【问题描述】:
我有方法:
export const groupActivities = ({ activities, tags, images, tickets }) => {
if (!activities || !tags) {
console.error('Must have activities and tags');
}
const groupActivities = Object.assign({}, activities);
const groups = groupByTags({ activities: groupActivities, tags });
groups.forEach(group => {
group.length = group.activities.length;
console.log(group.length);
group.activities.forEach(activity => {
if (images) {
activity.images = activity.imageIds.map(id => images[id]);
}
if (tickets) {
console.warn('No tickets provided to the groupactivities helper. May cause problems.');
activity.tickets = activity.ticketIds.map(id => tickets[id]);
}
});
});
return groups;
};
Object.assign 正在复制活动对象,但仍保留对它的引用,因此如果我找到特定活动并更改其上的某些属性,它也会更改原始对象! (更改 groupActivities['someID'].name = 'name' 会更改活动对象上的相应活动!)
这会导致一些奇怪的错误。有什么解决办法吗?
使用 babel 5 进行编译。
【问题讨论】:
-
Object.assign 进行浅拷贝,因此子对象引用链接是可以预期的。请参阅“克隆对象”以断开链接。如果您不需要继承、日期或方法,
JSON.parse(JSON.stringify(obj))可以快速复制普通对象而无需讨厌的外部引用。 -
“有什么解决办法吗?” 做一个深拷贝? What is the most efficient way to clone an object?.
-
请阅读标签说明! babel 是针对具有该名称的 Python 库的问题。
-
我确实需要深拷贝,因此我认为
Object.assign会做深拷贝?我没有使用 jquery,只是 es6 -
是的,不管你听到什么,你现在都有正确的答案了。
标签: javascript babeljs