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

问题描述 投票:0回答:1

我使用淘汰赛与SharePoint,我使用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: [{...}]
}]

我尝试使用forEach循环的Object.keys,for循环,但完全混淆。

javascript knockout.js sharepoint-2013
1个回答
1
投票

您只能使用一个forEach循环或Object.keys来解决这个问题。您必须在多个键和多个级别上对对象进行分组。

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

var years = {};

obj.forEach(function(o) {
  years[o.Year] = years[o.Year] || { months: {} };
  years[o.Year].months[o.Month] = years[o.Year].months[o.Month] || [];
  years[o.Year].months[o.Month].push(o.Title);
});

var initialData = Object.keys(years).map(function(year) {
  return {
    Year: year,
    Months: Object.keys(years[year].months).map(function(month) {
      return {
        Month: month,
        News: years[year].months[month].map(function(title) {
          return {
            Title: title,
          };
        })
      };
    })
  };
});
© www.soinside.com 2019 - 2024. All rights reserved.