简体   繁体   English

JSON 按键值分组到新的 JSON Javascript

[英]JSON group by key value to new JSON Javascript

I have been reading some posts which are related to my question, whereas I have not been able to find a proper solution for what I'm trying to do hear.我一直在阅读一些与我的问题相关的帖子,而我一直无法找到适合我想要听到的内容的正确解决方案。

I have this JSON file that I am obtaining directly from my database via a sql query:我有这个 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
            }
        ]
    }
]

My objectif is to be able to sort/transform this json object to a new json object which is classified by the scenario, so, something that looks like:我的目标是能够将此 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
            }
 ]

I have been trying some javascript selfmade functions but I have not obtainend the desired result.我一直在尝试一些 javascript 自制函数,但我没有得到想要的结果。 This is the last thing I've tried:这是我尝试过的最后一件事:

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

    }

Thank you谢谢

You can achieve this easily with built-in functions like reduce .您可以使用诸如reduce类的内置函数轻松实现这一点。 Iterate over the input, grouping into an object indexed by scenario , creating a object with a data array if the scenario doesn't exist yet, and push to that array:迭代输入,分组到一个由scenario索引的对象,如果scenario尚不存在,则创建一个带有data数组的对象,然后推送到该数组:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM