Javascript中的数组和对象复制

Javascript中的数组和对象复制,javascript,arrays,object,copy,Javascript,Arrays,Object,Copy,我有以下数据: [ {"date":1900,"data":[ {"name":"Blackbird","value":0}, {"name":"Seagull","value":1}, {"name":"Sparrow","value":0} ]}, {"date":1910,"data":[ {"name":"Owl","value":1} ]}, {"date":1920,"data":

我有以下数据:

[
    {"date":1900,"data":[
        {"name":"Blackbird","value":0},
        {"name":"Seagull","value":1},
        {"name":"Sparrow","value":0}
    ]},
    {"date":1910,"data":[
        {"name":"Owl","value":1}
    ]},
    {"date":1920,"data":[
        {"name":"Eagle","value":0},
        {"name":"Albatross","value":2}
    ]}
]
我需要从中创建一个增量数组。它应该是这样的:

[
    [
        {"name":"Blackbird","value":0,"date":1900},
        {"name":"Seagull","value":1,"date":1900},
        {"name":"Sparrow","value":0,"date":1900}
    ],
    [
        {"name":"Blackbird","value":0,"date":1910},
        {"name":"Seagull","value":1,"date":1910},
        {"name":"Sparrow","value":0,"date":1910},
        {"name":"Owl","value":1,"date":1910}
    ],
    [  
        {"name":"Blackbird","value":0,"date":1920},
        {"name":"Seagull","value":1,"date":1920},
        {"name":"Sparrow","value":0,"date":1920},
        {"name":"Owl","value":1,"date":1920},
        {"name":"Eagle","value":0,"date":1920},
        {"name":"Albatross","value":2,"date":1920}
    ]
]
无论我尝试了什么,我总是以添加到对象中的所有日期都等于最后一个值(这里是1920)作为结束。据我所知,这些对象仅通过引用进行复制。我尝试过使用array.map()(如中所述,但我的问题没有正确表述),但我仍然遇到同样的问题

编辑 下面是我尝试过的一个代码示例:

        var temp = [];
        var b = data.map(function(c, index, main) {
            var year = c.date;
            temp = [];
            main.slice(0, index + 1).map(function(d){
                var t = d.data.map(function(e){
                    e.date = year;
                    return e;
                });
                temp = temp.concat(t);
            });
            return temp;
        });
        console.log(b);

使用map,迭代内部数组,并为每个对象设置
date
属性等

var数据=[
{“日期”:1900,“数据”:[
{“name”:“Blackbird”,“value”:0},
{“名称”:“海鸥”,“值”:1},
{“名称”:“麻雀”,“值”:0}
]},
{“日期”:1910年,“数据”:[
{“name”:“Owl”,“value”:1}
]},
{“日期”:1920,“数据”:[
{“名称”:“鹰”,“值”:0},
{“名称”:“信天翁”,“值”:2}
]}
]
data=data.map(功能(obj、i、arr){
var o=[];
arr.slice(0,i).forEach(函数(项){
item.data.forEach(函数(数据){
o、 push(Object.assign({},data))
});
});
返回o.concat(obj.data.map(函数(项){item.date=obj.date;返回项});
});
document.body.innerHTML=''+JSON.stringify(数据,null,4)+''试试这个:

var数据=[
{“日期”:1900,“数据”:[
{“name”:“Blackbird”,“value”:0},
{“名称”:“海鸥”,“值”:1},
{“名称”:“麻雀”,“值”:0}
]},
{“日期”:1910年,“数据”:[
{“name”:“Owl”,“value”:1}
]},
{“日期”:1920,“数据”:[
{“名称”:“鹰”,“值”:0},
{“名称”:“信天翁”,“值”:2}
]}
];
var结果=data.map(函数(项){
var替换=[];
for(项目数据中的var键){
var子项=项.数据[键];
subItem.date=item.date;
更换、推送(子项);
}
退换货;
});

document.body.innerHTML=''+JSON.stringify(结果,null,3)+''以下是一个工作示例:

您需要克隆对象以“断开”引用

var数据=[
{
“日期”:1900年,
“数据”:[
{“name”:“Blackbird”,“value”:0},
{“名称”:“海鸥”,“值”:1},
{“名称”:“麻雀”,“值”:0}
]
},
{
“日期”:1910年,
“数据”:[
{“name”:“Owl”,“value”:1}
]
},
{
“日期”:1920年,
“数据”:[
{“名称”:“鹰”,“值”:0},
{“名称”:“信天翁”,“值”:2}
]
}
];
var增量=[];
var dataHistory=null;
对于(i=0;idocument.body.innerHTML=''+JSON.stringify(增量,null,4)+''请显示您尝试过的代码。因为只有2-3个道具,只需在每次迭代中通过文字创建一个新对象即可。类似于
{name:o.name,value:o.value,date:x.date}
它将日期添加到对象中,但不会创建“增量”数组。哦,您也希望在添加之前的数组时添加它们。只需再次映射并切片并返回就可以了,虽然x应该被数据取代,对吗?我已经在我提供的代码示例(在temp.concat(t)上)中使用了JSON.parse和JSON.stringify的技巧,解决了我的问题。很高兴这有帮助,这是一种简单的跨浏览器克隆对象的方法;)