Javascript 将列表重新格式化为分组结构

Javascript 将列表重新格式化为分组结构,javascript,knockout.js,sharepoint-2013,Javascript,Knockout.js,Sharepoint 2013,我在SharePoint中使用knockout,我使用getJSON查询获取所有新闻列表中的数据。我需要创建一个边栏,按时间顺序分组列表,结构如下:年->月->新闻标题 我已经设置了视图,可以以initialData集中的格式显示所有数据 你能帮我重新格式化这个列表吗 var obj = [{ "Year":"2018", "Month":"January", "Title":"News 18 January 2018"

我在SharePoint中使用knockout,我使用getJSON查询获取所有新闻列表中的数据。我需要创建一个边栏,按时间顺序分组列表,结构如下:年->月->新闻标题

我已经设置了视图,可以以initialData集中的格式显示所有数据

你能帮我重新格式化这个列表吗

var obj = [{  
            "Year":"2018",
            "Month":"January",
            "Title":"News 18 January 2018"
          },
          {...}];
对于这一观点:

var initialData = 
[{
    Year: "2018",
    Months: [{
        Month: "January",
        News: [
            {Title: "News 18 January 2018"},
            {Title: "News 23 January 2018"}]
            },
        {Month: "February",
        News: [{...}]},
        ]
    },{ Year: "2017", Months: [{...}]
}]

我尝试将Object.keys与forEach循环、for循环一起使用,但完全混淆了。

仅使用单个forEach循环或Object.keys无法解决此问题。您必须在多个关键点和多个级别上对对象进行分组

首先,构建一个以年和月为键的对象,以便能够快速找到每个对象的匹配数组。然后将此键值映射展开为嵌套数组

var年={};
对象forEach(函数(o){
年[o.Year]=年[o.Year]| |{月:{};
年[o.Year]。月[o.Month]=年[o.Year]。月[o.Month]| |[];
年[o.Year]。月[o.Month]。推送(o.Title);
});
var initialData=Object.keys(年).map(函数(年){
返回{
年份:年份,,
月:对象。键(年[年]。月)。映射(函数(月){
返回{
月:月,,
新闻:年[年]。月[月]。地图(功能(标题){
返回{
标题:标题,,
};
})
};
})
};

});托马斯,如果我需要在新闻数组中添加另一个字段,该怎么办?我忘了拉取新闻Id以生成链接。更改
年[o.Year]。月[o.Month]。推送(o.Title)
年[o.Year]。月[o.Month]。推送({Title:o.Title,Id:o.Id})
新闻:年[年]。月[月]。映射(函数(标题){return{title:title};})
新闻:年[年]。月[月]