【问题标题】:Group by in JavaScript - flat array to nested JSON在 JavaScript 中分组 - 平面数组到嵌套 JSON
【发布时间】:2019-12-17 03:25:10
【问题描述】:

我的前端打字稿文件中有这个列表:

poMonths:

0: {id: 1, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2019-12-15T00:00:00", purchaseMonthString: "Dec-2019" , year: 2019, month: "December"}
1: {id: 2, companyName: "company5", companyId: 5, flActive: true, purchaseMonth: "2019-12-15T00:00:00", …}
2: {id: 3, companyName: "company13", companyId: 13, flActive: true, purchaseMonth: "2019-11-15T00:00:00", …}
3: {id: 4, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2019-11-15T00:00:00", …}
4: {id: 5, companyName: "company5", companyId: 5, flActive: true, purchaseMonth: "2019-10-15T00:00:00", …}
5: {id: 6, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2020-09-15T00:00:00", …}
6: {id: 7, companyName: "company7", companyId: 7, flActive: true, purchaseMonth: "2020-09-15T00:00:00", …}

我想从中得到一个嵌套的树 json,按 compnayName 和 year 属性分组,类似于此,但采用 JSON 格式:

我找到了这段代码,但是它没有完全返回结果,需要稍微调整一下:

keys = [
    'year',
    'companyName'
  ];

groupBy() {
    const drill = (o, key, ...keys) =>
      key ? drill((o[key] = o[key] || {}), ...keys) : o;
    const result = {};
    for (const e of this.poMonths) {
      const key = drill(
        result,
        e.companyName,
        e.year,

        e.month
      );
    }
    return result;
  }

我怎样才能让它工作?

【问题讨论】:

    标签: javascript json typescript group-by javascript-objects


    【解决方案1】:

    您可以使用array.reduce() 构建您的树。它从一个空对象开始,当在特定键下还没有定义对象/数组时将分配默认值(|| 运算符的右侧将被执行):

    let input = [{id: 1, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2019-12-15T00:00:00", year: 2019, month: "December"},
    {id: 2, companyName: "company5", companyId: 5, flActive: true, purchaseMonth: "2019-12-15T00:00:00", year: 2019, month: "December"},
    {id: 3, companyName: "company13", companyId: 13, flActive: true, purchaseMonth: "2019-11-15T00:00:00", year: 2019, month: "November"},
    {id: 4, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2019-11-15T00:00:00", year: 2019, month: "December"},
    {id: 5, companyName: "company5", companyId: 5, flActive: true, purchaseMonth: "2019-10-15T00:00:00", year: 2019, month: "October"},
    {id: 6, companyName: "company14", companyId: 14, flActive: true, purchaseMonth: "2020-09-15T00:00:00", year: 2020, month: "September"},
    {id: 7, companyName: "company7", companyId: 7, flActive: true, purchaseMonth: "2020-09-15T00:00:00", year: 2020, month: "September"}]
    
    let months = { "09": "September", "10": "October", "11": "November", "12": "December" }
    
    let result = input.reduce((state,current) => {
       let {companyName, year, month} = current;
       
       let company = state[companyName] || (state[companyName] = {});
       let yearObj = company[year] || (company[year] = {});
       let monthArr = yearObj[month] || (yearObj[month] = []);
       monthArr.push(current);
       
       return state;
    }, {});
    
    console.log(result);

    【讨论】:

    • @EfronA。修改了我的答案
    • 你知道我怎样才能在“月”级别拥有“id”属性吗?目前,id 将在月份下方显示为一个孩子,但是,每个月下面只有一个 id,所以我希望在月份级别有 id。你会怎么做?
    • @EfronA。请打开另一个问题以保持清晰
    • 谢谢,根据您在此处的回答,问题略有不同:stackoverflow.com/questions/59744446/…
    • 很好的答案 - 快速提问。从月份有效负载中删除括号的最简单方法是什么=>“十二月”:[{到“十二月”:{。另外,是否可以删除嵌套部分(公司名称、年份、月份)中的重复键?
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多