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

标签 javascript knockout.js sharepoint-2013

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

我已经设置了 View ,并且可以以initialData 集中的格式显示所有数据。

您能帮我重新格式化此列表吗:

var obj = [{  
            "Year":"2018",
            "Month":"January",
            "Title":"News 18 January 2018"
          },
          {...}];

此 View :

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 循环、for 循环尝试了 Object.keys,但完全困惑了。

最佳答案

仅使用单个 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,
          };
        })
      };
    })
  };
});

关于javascript - 将列表重新格式化为分组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49064768/

相关文章:

javascript - 如何放大与坐标轴文本保持一致的区域?谷歌图表

javascript - anchor 标记在 gmail 附件中不起作用

javascript - 从电子表格名称获取电子表格 ID 或 url

javascript - 使用knout js在foreach中添加类别

javascript - 元素生成 jquery 后运行函数

sharepoint - 当我在 office365 "sharepoint online"中插入 iframe 时,出现错误

sharepoint - 使用客户端对象模型获取已安装应用程序列表

用于检查 map 中心是否已移动的 JavaScript 在移动设备上不起作用

jQuery datepicker,设置 knockout 可观察的日期格式

javascript - 将 viewmodel 属性设置为列表中的项目