我想要将两个数组数据组合成一个数组,第一个数组只包含date和id的数据,第二个数组包含name和id。
temp_data:[
0:{
id:"1"
date:"2017-11-07"
}
1:{
id:"1"
date:"2017-11-08"
}
2:{
id:"2"
date:"2017-11-07"
}
3:{
id:"2"
date:"2017-11-08"
}
]
name:[
0:{
id:"1"
name:"Pervies, Peter"
}
1:{
id:"2"
name:"Ming, Edmund"
}
]
我希望数据看起来像这样:
data:[
0:{
id:"1"
name:"Pervies, Peter"
details:[
{date:"2017-11-07"},
{date:"2017-11-08"}
]
}
1:{
id:"2"
name:"Ming, Edmund"
details:[
{date:"2017-11-07"},
{date:"2017-11-08"}
]
}
]
我已经尝试了下面的代码来组合这两个数组,但它的工作原理却不符合我的预期。
let len = temp_data.length;
let leng = name.length;
for (let i = 0; i < leng; ++i) {
for (let x = 0; x < len; ++x) {
if (name[i].id == temp_data[x].id) {
let id = name[i].id;
let details = temp_data[x];
data.push({id,details})
}
}
}
// ------------------------------------------------------------------------
let dat = temp_data,
hash = Object.create(null),
result = [];
dat.forEach(function (o) {
if (!hash[o.id]) {
hash[o.id] = [];
result.push(hash[o.id]);
}
hash[o.id].push(o);
});
data = result;
你可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以使用Map
并仅迭代两个数组。
var data = [{ id: "1", date: "2017-11-07" }, { id: "1", date: "2017-11-08" }, { id: "2", date: "2017-11-07" }, { id: "2", date: "2017-11-08" }],
names = [{ id: "1", name: "Pervies, Peter" }, { id: "2", name: "Ming, Edmund" }],
map = new Map,
result = names.map(({ id, name }) => ({ id, name, details: map.set(id, []).get(id) }));
data.forEach(({ id, date }) => map.get(id).push({ date }));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
这是实现此目的的一种方法:
Object.values()
)没什么特别的,但是这样做。
答案 2 :(得分:0)
首先你的数组中有错误,数组不像我在评论中所说的那样存储key:value
对,在你需要,
分隔数组条目的对象内,你需要{{1}分隔实际对象内的属性。
将数组分配给变量时,不要使用,
,而应使用:
,否则会出现语法错误。
您可以使用简单的双向循环方式,如下所示;
=
这将以简单,旧的方式生成您想要的输出。例如,请参阅JSFiddle。
答案 3 :(得分:0)
这是你可以做到的:
首先按temp_data
属性对您的id
数组项进行分组:
temp_data.forEach(function(d) {
if (!results.some(function(item) {
return item.id == d.id;
})) {
let mixed = {};
mixed.id = d.id;
(mixed.details = mixed.details || []).push({
"date": d.date
});
results.push(mixed);
} else {
results.find(function(r) {
return r.id == d.id;
}).details.push({
"date": d.date
});
}
});
然后将name
属性添加到results
数组中每个相关项目,names
数组:
results.forEach(function(r) {
if (names.some(function(n) {
return n.id == r.id;
})) {
r.name = names.find(function(name) {
return name.id == r.id;
}).name;
}
});
<强>解释强>
.forEach()
循环合并的数组元素,并使用
每个item
:.some()
方法检查项目是否存在
数组中的id
相同。.find()
获取此对象(如果存在)并更新它
有相关数据。<强>演示:强>
const temp_data = [{
id: "1",
date: "2017-11-07"
},
{
id: "1",
date: "2017-11-08"
},
{
id: "2",
date: "2017-11-07"
},
{
id: "2",
date: "2017-11-08"
}
];
const names = [{
id: "1",
name: "Pervies, Peter"
}, {
id: "2",
name: "Ming, Edmund"
}];
var results = [];
//First group your first array objects by id
temp_data.forEach(function(d) {
if (!results.some(function(item) {
return item.id == d.id;
})) {
let mixed = {};
mixed.id = d.id;
(mixed.details = mixed.details || []).push({
"date": d.date
});
results.push(mixed);
} else {
results.find(function(r) {
return r.id == d.id;
}).details.push({
"date": d.date
});
}
});
results.forEach(function(r) {
if (names.some(function(n) {
return n.id == r.id;
})) {
r.name = names.find(function(name) {
return name.id == r.id;
}).name;
}
});
console.log(results);
答案 4 :(得分:0)
var temp_date = [{"id": "1", "date": "2017-11-07"}, {"id": "1", "date": "2017-11-08"}, {"id": "2", "date": "2017-11-07"}, {"id": "2", "date": "2017-11-08"}];
var name = [{"id": "1", "name": "Pervies, Peter"}, {"id": "2", "name": "Ming, Edmund"}];
var data = []
for(var i = 0; i < name.length; i++ ){
data.push({"id": name[i].id, "name": name[i].name, "details": []});
for(var j = 0; j < temp_date.length; j++){
if(name[i].id === temp_date[j].id){
data[i].details.push({"date": temp_date[j].date});
}
}
}
需要更正temp_date和name数组并应用上述逻辑。
答案 5 :(得分:0)
您可以使用非核心库来执行此任务:
let _ = require ('underscore');
let temp_data =[
{
id:"1",
date:"2017-11-07"
},
{
id:"1",
date:"2017-11-08"
},
{
id:"2",
date:"2017-11-07"
},
{
id:"2",
date:"2017-11-08"
}
] ;
let name = [
{
id:"1",
name:"Pervies, Peter"
},
{
id:"2",
name:"Ming, Edmund"
}
];
temp_data = temp_data.concat(name);
let groupedTempData = _.groupBy(temp_data,function(item){
return item.id;
});
let result = [];
_.each(groupedTempData,function(item){
let obj = {};
obj.details =[];
_.each(item,function(data){
if(data.name){
obj.name = data.name;
}
if(data.date){
obj.details.push({date:data.date});
}
});
obj.id = item[0].id;
result.push(obj);
});
console.log(JSON.stringify(result));