不中断日期的Javascript深度复制
我想在不将日期对象转换为字符串的情况下进行深度复制(中断引用),我该如何做不中断日期的Javascript深度复制,javascript,date,copy,Javascript,Date,Copy,我想在不将日期对象转换为字符串的情况下进行深度复制(中断引用),我该如何做 a=[{ 日期:新日期() }, { 名字:“约翰” }]; //设b=a.slice();//这复制了对象引用,这是错误的(我们需要一个obejcts的副本) //设b=[…a];//这复制了对象引用,这是错误的(我们需要一个obejcts的副本) //设b=JSON.parse(JSON.stringify(a));//这使得日期成为字符串,这是错误的(我们想要的是日期对象,而不是字符串) 设b=a.slice()
a=[{
日期:新日期()
}, {
名字:“约翰”
}];
//设b=a.slice();//这复制了对象引用,这是错误的(我们需要一个obejcts的副本)
//设b=[…a];//这复制了对象引用,这是错误的(我们需要一个obejcts的副本)
//设b=JSON.parse(JSON.stringify(a));//这使得日期成为字符串,这是错误的(我们想要的是日期对象,而不是字符串)
设b=a.slice();
a[1]。姓名='PETER';
控制台日志(a);
//[{日期:2020-06-08T09:10:32.530Z},{姓名:'彼得'}]
控制台日志(b);
//[{date:2020-06-08T09:10:32.530Z},{name:'PETER'}]
这将深度复制对象,如果这解决了您的问题,请告诉我:
let a=[{date:new date()},{name:'John'}];
设b=a.map(k=>({…k}));
a[1]=“彼得”;
控制台日志(a);
控制台日志(b)代码>这里有一个用于深度复制对象的实用程序。希望这有帮助
const deepCopy=(objectToBeCloned)=>{
让resultObj、value、key
if(objectToBeCloned的类型!==“object”| | objectToBeCloned===null){
返回要删除的对象
}
if(对象类型待删除==“对象”){
if(objectToBeCloned.constructor.name!=“对象”){
ResultToBj=新的objectToBeCloned.constructor(objectToBeCloned)
}否则{
resultObj=Array.isArray(objectToBeCloned)?[]:{}
}
}
for(输入要删除的对象){
value=objectToBeCloned[key]
//嵌套对象和数组的递归复制
resultObj[key]=deepCopy(值)
}
返回结果ToBj
}
设a=[{
日期:新日期(),
x:{y:{z:1}},
测试:[1,2,3,4],
testArrObj:[{x:1,y:2}]
}, {
名字:“约翰”
}];
设b=deepCopy(a)
a[1].name=“PETER”;
控制台日志(b);
控制台日志(a);
console.log(a==b)
console.log(b==b)
基本深度克隆,支持日期+时区,使用Typescript编写(如果不需要,请删除类型)
导出函数克隆(x:T){
//JSON到字符串
var-to=(k:string,v:any)=>{
//用时区序列化日期
如果(v&v实例开始日期){
return v.toutString()
}
返回v
}
//字符串到JSON
var-from=(k:string,v:any)=>{
//恢复日期
if(v&&typeof v==“string”&&v.indexOf(“Z”)>-1&&moment(v.isValid()){
返回新日期(v)
}
返回v
}
返回JSON.parse(JSON.stringify(x,to),from)作为T
}
设a=[{
日期:新日期(),
x:{y:{z:1}},
测试:[1,2,3,4],
testArrObj:[{x:1,y:2}]
}, {
名字:“约翰”
}];
设b=克隆(a)
a[1].name=“PETER”;
控制台日志(b);
控制台日志(a);
console.log(a==b)
console.log(b==b)
注意:一个改进是删除
时刻
依赖关系。您介意发布一个更详细的答案吗?:)我看不出map在这里有什么帮助?据我所知,对对象数组进行深度克隆的最佳方法是使用对象分配
或扩展运算符
。如果你想“深度复制”一个对象,你可以在这里阅读,然后你必须测试每个值,看看它是否是一个原语,如果它是一个对象,对不同类型的对象应用不同的策略。复制日期只是new date(+date)
,复制DOM元素有点棘手,但并非不可能。复制的DOM元素可能不会“破坏引用”,它会复制引用,因此a[0]。日期===b[0]。日期
。它不会复制嵌套对象(如果有)。嵌套对象仍将具有相同的引用。@NithishGandesiri是的,我知道,这是OP共享的数据,我已在此基础上提供了我的答案。抱歉@gorak,我刚才告诉过你,因为在问题中提到需要深度复制。@gorak是的,这很完美。对于这里的其他评论,我可能把问题的措辞弄错了?但无论如何,这似乎解决了我的问题。
export function clone<T>(x: T) {
// JSON to string
var to = (k: string, v: any) => {
// Serialise date with timezone
if (v && v instanceof Date) {
return v.toUTCString()
}
return v
}
// String to JSON
var from = (k: string, v: any) => {
// Restore date
if (v && typeof v == "string" && v.indexOf("Z") > -1 && moment(v).isValid()) {
return new Date(v)
}
return v
}
return JSON.parse(JSON.stringify(x, to), from) as T
}
let a = [{
date: new Date(),
x: {y:{z:1}},
test: [1,2,3,4],
testArrObj: [{x:1, y:2}]
}, {
name: 'John'
}];
let b = clone(a)
a[1].name = "PETER";
console.log(b);
console.log(a);
console.log(a === b)
console.log(b === b)