【问题标题】:Convert Json format for Nvd3 chart Angular 2为 Nvd3 图表 Angular 2 转换 Json 格式
【发布时间】:2017-05-29 11:07:27
【问题描述】:

我有这样的数据:

data2 = [
        {
            "earnings_type": "C",
            "payment_date": "Jan",
            "amount": 10
        },
        {
            "earnings_type": "C",
            "payment_date": "Jan",
            "amount": 10
        }, {
            "earnings_type": "E",
           "payment_date": "Jan",
            "amount": 10
        },
    ]

我需要把它转换成这个

data2 = [
        {
            "key": "C", 
            "values":
            [
                {
                    "label": "15-01-2017", 
                    "value": 20 
                },
                {
                    "label": "17-02-2017",
                    "value": 16
                }
            ]
        }, 
        {
            "key": "E",  
            "values": [
                {
                    "label": "15-01-2017",
                    "value": 15
                }
            ]
        }
        ];

我需要做的是通过数据找到所有收入类型为 C 的项目,并将其设为键并将值放在其下方。然后对所有收入类型为 A 的项目执行相同操作。

任何帮助将不胜感激。

【问题讨论】:

  • 我有来自 AWS api 网关的数据。我已经获取了第一个 Json 数据并将其转换为我在其他地方使用的数组。但是现在我需要将该数组转换回上面显示的第二个 json 数据结构。

标签: json angular nvd3.js


【解决方案1】:

使用 Array.prototype.reduce。不确定如何将 payment_date 转换为标签,因为示例数据具有 payment_date 的月份名称,但 label 的完整日期。如果你需要使用当月的中点,我相信你可以根据下面的代码弄清楚如何做到这一点。

const origData = [
  {
    earnings_type: "C",
    payment_date: "Jan",
    amount: 10
  },
  {
    earnings_type: "C",
    payment_date: "Jan",
    amount: 10
  },
  {
    earnings_type: "E",
    payment_date: "Jan",
    amount: 10
  }
];

const newData = origData.reduce((result, origDataPoint) => {
  const matchingDataPoint = result.find(
    datapoint => datapoint.key === origDataPoint.earnings_type
  );
  if (!matchingDataPoint) {
    result.push({
      key: origDataPoint.earnings_type,
      values: [
        {
          label: origDataPoint.payment_date,
          value: origDataPoint.amount
        }
      ]
    });
  } else {
    matchingDataPoint.values.push({
      label: origDataPoint.payment_date,
      value: origDataPoint.amount
    });
  }
  return result;
}, []);

【讨论】:

  • 非常感谢您的回复。我现在将尝试实施您的解决方案。很抱歉,示例中的数据具有误导性。我不需要将月份名称转为完整日期。我就这样快速输入了它。
  • 我实现了这个解决方案,它运行良好。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2013-11-07
  • 2017-05-10
  • 2014-02-27
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多