不中断日期的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)