Javascript 将对象数组转换为用于构建图表的嵌套数组

Javascript 将对象数组转换为用于构建图表的嵌套数组,javascript,arrays,json,javascript-objects,Javascript,Arrays,Json,Javascript Objects,我有以下数组 const data = [ { date: "2018-01-01", label: "MH", qt: 10 }, { date: "2018-04-01", label: "MH", qt: 30 }, { date: "2018-02-01", label: "GJ", q

我有以下数组

const data = [
      {
        date: "2018-01-01",
        label: "MH",
        qt: 10
      },
      {
        date: "2018-04-01",
        label: "MH",
        qt: 30
      },
      {
        date: "2018-02-01",
        label: "GJ",
        qt: 30
      },
      {
        date: "2018-03-01",
        label: "KL",
        qt: 30
      },
      {
        date: "2018-02-01",
        label: "KL",
        qt: 40
      }
    ]
我希望我的输出是

[
  [date,MH,GJ,KL],
  ['Jan 2018',10,null,null],
  ['Feb 2018',null,30,40],
  ['Mar 2018',null,null,30],
  ['Apr 2018',30,null,null]
]
如何以优化的方式实现这一点? 并且应该对日期进行排序,以便进行排序。 我试过了

data.sort(function compare(a, b) {
      var dateA = new Date(a.date);
      var dateB = new Date(b.date);
      return dateA - dateB;
    });
    let labelArr = data.map(l => l.label);
    let dateArr = data.map(l => l.date);
    labelArr = _.uniq(labelArr);
    dateArr = _.uniq(dateArr);
    console.log(labelArr, dateArr);

    const outputArr = [];
    dateArr.forEach(d => {
      labelArr.forEach(l => {
        const tempObj = data.filter(r => {
          if (d == r.date && l == r.label) {
            return r;
          }
          else {
            return { date: d, label: l, qt: null }
          }
        })
        outputArr.push(tempObj);
      });
    });

但我被困在这里了。我想的是,首先,我将为date和label创建不存在的对象,并将其qt添加到null。之后,我将按日期分组,然后仅将qt插入结果中

您可以使用一个对象来保存每个日期的数组,并使用一个对象来跟踪列的索引

最后,将未设置项的所有元素设置为null

var数据=[{日期:2018-01-01,标签:MH,qt:10},{日期:2018-04-01,标签:MH,qt:30},{日期:2018-02-01,标签:GJ,qt:30},{日期:2018-03-01,标签:KL,qt:30},{日期:2018-02-01,标签:KL,qt:40}], cols={}, 行={}, 结果=数据 .sort{date:a},{date:b}=>a>b | |-a{ 日期=日期0,7; 如果!行[日期]r.pushrows[日期]=[日期]; 如果!cols[label]cols[label]=r[0].pushlabel-1; 行[date][cols[label]]=行[date][cols[label]]||0+qt; 返回r; },['日期']] .mapa,{length}]=>Array.from{length},{i=>a[i]| | null; console.logresult;
.作为控制台包装{max height:100%!important;top:0;}您可以使用一个对象来保存每个日期的数组,并使用一个对象来跟踪列的索引

最后,将未设置项的所有元素设置为null

var数据=[{日期:2018-01-01,标签:MH,qt:10},{日期:2018-04-01,标签:MH,qt:30},{日期:2018-02-01,标签:GJ,qt:30},{日期:2018-03-01,标签:KL,qt:30},{日期:2018-02-01,标签:KL,qt:40}], cols={}, 行={}, 结果=数据 .sort{date:a},{date:b}=>a>b | |-a{ 日期=日期0,7; 如果!行[日期]r.pushrows[日期]=[日期]; 如果!cols[label]cols[label]=r[0].pushlabel-1; 行[date][cols[label]]=行[date][cols[label]]||0+qt; 返回r; },['日期']] .mapa,{length}]=>Array.from{length},{i=>a[i]| | null; console.logresult;
.as console wrapper{max height:100%!important;top:0;}我不知道这是否是最好的解决方案,但这是一个有效的解决方案:

常数数据=[{ 日期:2018-01-01, 标签:MH, qt:10 }, { 日期:2018-04-01, 标签:MH, qt:30 }, { 日期:2018-02-01, 标签:GJ, qt:30 }, { 日期:2018-03-01, 标签:吉隆坡, qt:30 }, { 日期:2018-02-01, 标签:吉隆坡, qt:40 } ] 函数formatDatadata{ 常量标签={}; 常量映射={}; 数据 .sorta,b=>a.date{ const date=momentitem.date.format'MMM-YYYY'; 标签[项.标签]=真; 如果地图[日期]{ map[date][item.label]=item.qt; }否则{ map[date]={[item.label]:item.qt}; } }; const labelsArr=Object.keyslabels; const formattedData=Object.keysmap.mapdate=>{ const values=labelsArr.maplabel=>map[date][label]| | null; 返回[日期,…值]; }; 返回[['date',…labelsArr],…formattedData]; } const result=formatDatadata; console.logresult; .作为控制台包装{最大高度:100%!重要;顶部:0;}
我不知道这是否是最好的解决方案,但这是一个有效的解决方案:

常数数据=[{ 日期:2018-01-01, 标签:MH, qt:10 }, { 日期:2018-04-01, 标签:MH, qt:30 }, { 日期:2018-02-01, 标签:GJ, qt:30 }, { 日期:2018-03-01, 标签:吉隆坡, qt:30 }, { 日期:2018-02-01, 标签:吉隆坡, qt:40 } ] 函数formatDatadata{ 常量标签={}; 常量映射={}; 数据 .sorta,b=>a.date{ const date=momentitem.date.format'MMM-YYYY'; 标签[项.标签]=真; 如果地图[日期]{ map[date][item.label]=item.qt; }否则{ map[date]={[item.label]:item.qt}; } }; const labelsArr=Object.keyslabels; const formattedData=Object.keysmap.mapdate=>{ const values=labelsArr.maplabel=>map[date][label]| | null; 返回[日期,…值]; }; 返回[['date',…labelsArr],…formattedData]; } const result=formatDatadata; console.logresult; .作为控制台包装{最大高度:100%!重要;顶部:0;} 我试着这样做:

    data.sort(function compare(a, b) {
      var dateA = new Date(a.date);
      var dateB = new Date(b.date);
      return dateA - dateB;
    });
    let labelArr = data.map(l => l.label);
    let dateArr = data.map(l => l.date);
    labelArr = _.uniq(labelArr);
    dateArr = _.uniq(dateArr);

    const outputArr = [['Date', ...labelArr]];
    dateArr.forEach(d => {
      const o1 = data.filter(e => e.date == d)
      const o2 = o1.reduce((s, a) => {
        s[a.label] = a.qt;
        return s;
      }, {})
      const b1 = []
      labelArr.forEach(l => {
        b1.push(o2[l])
      });
      outputArr.push([moment(d).format('MMM YYYY'), ...b1]);
    });
希望它能帮助别人。

我尝试过这样做:

    data.sort(function compare(a, b) {
      var dateA = new Date(a.date);
      var dateB = new Date(b.date);
      return dateA - dateB;
    });
    let labelArr = data.map(l => l.label);
    let dateArr = data.map(l => l.date);
    labelArr = _.uniq(labelArr);
    dateArr = _.uniq(dateArr);

    const outputArr = [['Date', ...labelArr]];
    dateArr.forEach(d => {
      const o1 = data.filter(e => e.date == d)
      const o2 = o1.reduce((s, a) => {
        s[a.label] = a.qt;
        return s;
      }, {})
      const b1 = []
      labelArr.forEach(l => {
        b1.push(o2[l])
      });
      outputArr.push([moment(d).format('MMM YYYY'), ...b1]);
    });

希望这对其他人有所帮助。

请添加您的尝试。您想要MH,GJ,KL的固定顺序吗?@NinaScholz抱歉没有得到MH,GJ,KL数组中的顺序可以是随机的吗?@EugenSunic是的请添加您的尝试。您想要MH,GJ,KL的固定顺序吗?@NinaScholz抱歉没有得到您不能得到的
他在MH,GJ,KL数组中的顺序是随机的吗?@EugenSunic是的