Javascript - 如何从字典列表创建嵌套的json

时间:2018-02-28 09:23:51

标签: javascript json list nested

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

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"
      }
    ]
  }
]

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用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 );

答案 1 :(得分:0)

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



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);