转换Nvd3图表Angular 2的Json格式

时间:2017-05-29 11:07:28

标签: json angular nvd3.js

我有这样的数据:

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

我需要做的是通过数据查找所有items_type为C的项目并将其作为密钥并将值放在其下面。然后对所有items_type为A的项目执行相同的操作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用Array.prototype.reduce。不确定您如何将payment_date转换为标签,因为示例数据具有payment_date的月份名称,但标签的完整日期。如果您需要使用月中点,我相信您可以根据以下代码了解如何执行此操作。

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;
}, []);