JSON按键值分组到新的JSON Javascript

时间:2018-07-10 08:46:21

标签: javascript json

我一直在阅读一些与我的问题相关的帖子,而对于所要听到的内容却找不到合适的解决方案。

我有这个JSON文件,可以通过sql查询直接从数据库中获取:

[
    {
        "scenario": "scenario-483d742c-4492-4a4f-95fa-7ccceac8bb18",
        "data": [
            {
                "date": "2018-05-21",
                "price": 14.173041264216105
            }
        ]
    },
    {
        "scenario": "scenario-483d742c-4492-4a4f-95fa-7ccceac8bb18",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    }, 
    {
        "scenario": "scenario-c705069f-fa53-4ff3-9f07-3fcbf9dc8d15",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    },
    {
        "scenario": "scenario-c705069f-fa53-4ff3-9f07-3fcbf9dc8d15",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    },
    {
        "scenario": "scenario-d58bb001-d7ed-4744-8f6c-8377519c7a99",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    },
    {
        "scenario": "scenario-d58bb001-d7ed-4744-8f6c-8377519c7a99",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    }
]

我的objectif是为了能够将此json对象排序/转换为按场景分类的新json对象,因此,类似于:

[
    {
        "scenario": "scenario-483d742c-4492-4a4f-95fa-7ccceac8bb18",
        "data": [
            {
                "date": "2018-05-21",
                "price": 14.173041264216105
            },
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
        ]
    },
    {
        "scenario": "scenario-c705069f-fa53-4ff3-9f07-3fcbf9dc8d15",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            },
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }

        ]
    },
    {
        "scenario": "scenario-d58bb001-d7ed-4744-8f6c-8377519c7a99",
        "data": [
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            },  
            {
                "date": "2018-05-22",
                "price": 42.94691197077433
            }
 ]

我一直在尝试一些javascript自制函数,但未获得预期的结果。 这是我尝试过的最后一件事:

 let estructura = [];

    for (var j =0; j<obj.length; j++){
      for (var i=0; i<estructura.length; i++){
        if(obj[j]['scenario'] == estructura[i]['scenario']){
          estructura[i]['data'].push(obj[j]['data'])
        } else {
          console.log("no match, we add the scenario to estructura")
          estructura.push(
            {
              scenario:obj[j]['scenario'],
              data: []
            })
        }
      }

    }

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用reduce之类的内置函数轻松实现此目的。遍历输入,分组为由scenario索引的对象,如果data尚不存在,则创建带有scenario数组的对象,然后推送到该数组:

const input=[{"scenario":"scenario-483d742c-4492-4a4f-95fa-7ccceac8bb18","data":[{"date":"2018-05-21","price":14.173041264216105}]},{"scenario":"scenario-483d742c-4492-4a4f-95fa-7ccceac8bb18","data":[{"date":"2018-05-22","price":42.94691197077433}]},{"scenario":"scenario-c705069f-fa53-4ff3-9f07-3fcbf9dc8d15","data":[{"date":"2018-05-22","price":42.94691197077433}]},{"scenario":"scenario-c705069f-fa53-4ff3-9f07-3fcbf9dc8d15","data":[{"date":"2018-05-22","price":42.94691197077433}]},{"scenario":"scenario-d58bb001-d7ed-4744-8f6c-8377519c7a99","data":[{"date":"2018-05-22","price":42.94691197077433}]},{"scenario":"scenario-d58bb001-d7ed-4744-8f6c-8377519c7a99","data":[{"date":"2018-05-22","price":42.94691197077433}]}]

console.log(
  Object.values(input.reduce((a, { scenario, data }) => {
    if (!a[scenario]) a[scenario] = { scenario, data: [] };
    a[scenario].data.push(data[0]);
    return a;
  }, {}))
);