【问题标题】:Javascript - how to create nested json from list of dictionariesJavascript - 如何从字典列表中创建嵌套的 json
【发布时间】:2018-08-08 02:55:31
【问题描述】:

我正在努力从字典/数组列表中创建嵌套结构。 我有数据,我需要用它来构建一个 JSON 对象。

var data = [
   {"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},
   {"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"}, 
   {"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"}, 
   {"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},
   {"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}
];

预期输出:

[{
    "Sales Person": "S1",
    "Data": [{
        "Customer": "C1",
        "Data": [{
            "Sales Invoice": "SINV1",
            "Amt": 100
          },
          {
            "Sales Invoice": "SINV2",
            "Amt": 200
          }
        ],
        "Code": "0001"
      },
      {
        "Customer": "C2",
        "Data": [{
          "Sales Invoice": "SINV3",
          "Amt": 200
        }],
        "Code": "0001"
      }
    ]
  },
  {
    "Sales Person": "S2",
    "Data": [{
        "Customer": "C3",
        "Data": [{
          "Sales Invoice": "SINV4",
          "Amt": 100
        }],
        "Code": "0003"
      },
      {
        "Customer": "C4",
        "Data": [{
          "Sales Invoice": "SINV4",
          "Amt": 300
        }],
        "Code": "0004"
      }
    ]
  }
]

在此提前感谢您的帮助。

【问题讨论】:

  • 你已经尝试了什么?

标签: javascript json list nested


【解决方案1】:

您可以使用reduce 来组织/汇总数据

并使用map 对其进行格式化。

var data = [{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"}, {"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"}, {"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},{"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}];
	
var newData = Object.values(data.reduce((c,v)=>{
  c[v["Sales Person"]] = c[v["Sales Person"]] || {"Sales Person" : v["Sales Person"], "Data" : {}};
  c[v["Sales Person"]]["Data"][ v["Code"] ] = c[v["Sales Person"]]["Data"][ v["Code"] ] || { Customer : v["Customer"],"Data": [], Code: v["Code"] }
  c[v["Sales Person"]]["Data"][ v["Code"] ].Data.push( {"Sales Invoice": v["Sales Invoice"],"Amt": v["Amt"]} );
  return c;
},{})).map(v=>{
  v.Data = Object.values( v.Data );
  return v;
});
      
console.log( newData );

【讨论】:

  • 感谢 Eddie 提供完美的解决方案。非常感谢您的帮助。
  • 乐于帮助@SanjayKumar
【解决方案2】:

您可以将array#reduceObject.values() 一起使用。首先根据Sales Person 对数据进行分组,然后使用Customer 值对其进行分组。然后使用array#forEach 提取Data 中的所有Customer 值。

var data = [{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV1","Amt":100, "Sales Person":"S1"},{"Customer":"C1", "Code":"0001","Sales Invoice":"SINV2","Amt":200, "Sales Person":"S1"},{"Customer":"C2", "Code":"0002","Sales Invoice":"SINV3","Amt":200, "Sales Person":"S1"},{"Customer":"C3", "Code":"0003","Sales Invoice":"SINV4","Amt":100, "Sales Person":"S2"},{"Customer":"C4", "Code":"0004","Sales Invoice":"SINV5","Amt":300, "Sales Person":"S2"}];
var result = Object.values(data.reduce((r,o) => {
  r[o['Sales Person']] = r[o['Sales Person']] || {'Sales Person' : o['Sales Person'], Data : {} };
  r[o['Sales Person']].Data[o.Customer] = r[o['Sales Person']].Data[o.Customer] || {Data: [], Code: o.Code}
  r[o['Sales Person']].Data[o.Customer].Data.push({'Sales Invoice': o['Sales Invoice'], Amt : o['Amt']});
  return r;
},{}));

result.forEach(o => {
  o.Data = Object.values(o.Data);
});
console.log(result);

【讨论】:

  • 感谢 Hassan 提供的解决方案。欣赏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2021-11-20
  • 2021-04-19
  • 2018-01-16
相关资源
最近更新 更多