Javascript Object.assign保留对原始对象的引用
我有一个方法:Javascript Object.assign保留对原始对象的引用,javascript,babeljs,Javascript,Babeljs,我有一个方法: export const groupActivities = ({ activities, tags, images, tickets }) => { if (!activities || !tags) { console.error('Must have activities and tags'); } const groupActivities = Object.assign({}, activities); const groups = g
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正在复制activities对象,但仍然保留对它的引用,因此如果我找到一个特定的activity并更改它的某些属性,它也会更改原始属性!(更改groupActivities['someID'].name='name'会更改activities对象上的相应活动!)
这导致了一些奇怪的错误。有解决办法吗
使用babel 5进行编译。事实上,这可以通过不同的方式完成:
deep=true
):函数cloneObj(obj,deep=false){
var result={};
用于(输入obj){
if(对象的深和对象[key]实例){
if(obj[key]数组实例){
结果[键]=[];
obj[key].forEach(功能(项){
if(对象的项目实例){
结果[key].push(cloneObj(item,true));
}否则{
结果[键]。推送(项);
}
});
}否则{
结果[key]=cloneObj(obj[key]);
}
}否则{
结果[键]=对象[键];
}
}
返回结果
}
//浅拷贝
var newObject=cloneObj(oldObject);
//深度复制
var newObject=cloneObj(oldObject,true);
//浅拷贝
var newObject=jQuery.extend({},oldObject);
//深度复制
var newObject=jQuery.extend(true,{},oldObject);
//浅拷贝
var newObject=\ u0.clone(oldObject);
PS:我用以下数据测试了我的功能,效果良好:
var oldObject={a:1,b:{d:2,c:6},c:[1,2,{t:1}]};
newObject=cloneObj(oldObject,true);
新对象['b']['d']=8;
newObject['a']=8;
新对象['c'][2]['t']=5;
console.log(oldObject)
console.log(newObject)
Object.assign创建浅拷贝,因此需要子对象引用链接。请参阅关于“克隆对象”以断开链接。如果您不需要继承、日期或方法,JSON.parse(JSON.stringify(obj))
可以快速复制普通对象,而无需烦人的外部引用。“有解决方案吗?”进行深度复制。请阅读标签说明!是关于这个名字的Python库的问题。我确实需要一个深度副本,因此我想Object.assign
会做一个深度副本吗?我没有使用jquery,只是ES6是的,不管你听到了什么,你现在都有了正确的答案。