如何将对象数组合并到其他对象中

本文关键字:对象 其他 合并 数组 | 更新日期: 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,如果你有一个。