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;i document.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的技巧,解决了我的问题。很高兴这有帮助,这是一种简单的跨浏览器克隆对象的方法;)