如何将对象数组合并到其他对象中
本文关键字:对象 其他 合并 数组 | 更新日期: 2023-09-27 18:09:11
关于StackOverflow的第一个问题。我在网上搜索过,但没有找到这样一个具体的案例。我尽量说得具体些。
我有一个Data
数组的对象:
Data:
[
{ ID:"ID1", Name:"Name1", Date:"2015-08-21", TypeA:{ Count:1 }, TypeB:{ Count:2 } },
{ ID:"ID2", Name:"Name2", Date:"2015-08-21", TypeA:{ Count:3 }, TypeB:{ Count:4 } },
{ ID:"ID3", Name:"Name3", Date:"2015-08-23", TypeA:{ Count:5 }, TypeB:{ Count:6 } }
]
我试图根据Type
属性将所有这些对象数组分组为新对象,即如果TypeX.Count > 0
则将其添加到Type主对象。然后根据Date
属性添加它们,如果日期相同,则将它们合并到相同的日期下:
TypeA:
{
Dates:
[
{ Date: "2015-08-21",
Data:
[
{ ID: "ID1", Name: "Name1", Count: 1 },
{ ID: "ID2", Name: "Name2", Count: 3 }
]
},
{ Date: "2015-08-23",
Data:
[
{ ID: "ID3", Name: "Name1", Count: 5 }
]
}
]
},
TypeB:
{
Dates:
[
{ Date: "2015-08-21",
Data:
[
{ ID: "ID1", Name: "Name1", Count: 2 },
{ ID: "ID2", Name: "Name2", Count: 4 }
]
},
{ Date: "2015-08-23",
Data:
[
{ ID: "ID3", Name: "Name3", Count: 6 }
]
}
]
}
我已经使用Javascript完成了这一点,但现在我需要将整个逻辑转移到服务器端- c#/linq。
你需要GroupBy两次:-
var result = Data.GroupBy(x => x.Type)
.Select(x => new
{
TypeAB = x.Key,
Obj = x.GroupBy(z => z.Date)
.Select(z => new
{
Date = z.Key,
InnerObj = z.Select(i => new
{
Id = i.Id,
Name = i.Name,
Count = i.Count
})
}).ToArray()
});
第一个组由Type
,它将返回Key
(除了TypeA, TypeB等)和一个IEnumerable(每个类型中的对象)。进一步按Date
对这个列表进行分组,并投影Key和其他对象。这里我投射匿名类型,你可以选择实际的Type
,如果你有一个。