简体   繁体   中英

How to parse json one structure to another structure in optimize way using javascript?

I have below json

let result = [
    {
        "category": "Social Media",
        "category_id": 6,
        "sub_category": "Facebook",
        "sub_category_id": 5
    },
    {
        "category": "Social Media",
        "category_id": 6,
        "sub_category": "Instagram",
        "sub_category_id": 7
    },
    {
        "category": "Tech",
        "category_id": 3,
        "sub_category": "Angular",
        "sub_category_id": 1
    },
    {
        "category": "Tech",
        "category_id": 3,
        "sub_category": "Javascript",
        "sub_category_id": 6
    }
]

I am trying to active below

[
  {
    "category": "Social Media",
    "category_id": 6,
    "sub_category": [
      {
        "sub_category": "Instagram",
        "sub_catgory_id": 7
      },
      {
        "sub_category": "Facebook",
        "sub_catgory_id": 5
      }
    ]
  },
  {
    "category": "Tech",
    "category_id": 3,
    "sub_category": [
      {
        "sub_category": "Angular",
        "sub_catgory_id": 1
      },
      {
        "sub_category": "Javascript",
        "sub_catgory_id": 6
      }
    ]
  }
]

Below code i have tried. Can anyone help me to identify where i am doing wrong?

 let result = [{ "category": "Social Media", "category_id": 6, "sub_category": "Facebook", "sub_category_id": 5 }, { "category": "Social Media", "category_id": 6, "sub_category": "Instagram", "sub_category_id": 7 }, { "category": "Tech", "category_id": 3, "sub_category": "Angular", "sub_category_id": 1 }, { "category": "Tech", "category_id": 3, "sub_category": "Javascript", "sub_category_id": 6 } ]; const dataArr = []; result.forEach((value, key) => { let catgeory = { category: value.category, category_id: value.category_id, sub_category: [] }; catgeory.sub_category.push({ sub_category: value.sub_category, sub_category_id: value.sub_category_id }) dataArr.push(catgeory); }); console.log(dataArr);

 let result = [{ "category": "Social Media", "category_id": 6, "sub_category": "Facebook", "sub_category_id": 5 }, { "category": "Social Media", "category_id": 6, "sub_category": "Instagram", "sub_category_id": 7 }, { "category": "Tech", "category_id": 3, "sub_category": "Angular", "sub_category_id": 1 }, { "category": "Tech", "category_id": 3, "sub_category": "Javascript", "sub_category_id": 6 }]; console.log(result.reduce((res,el) => { const p = res.find(({category_id}) => category_id == el.category_id); if(p) { p.sub_category.push({ sub_category: el.sub_category, sub_category_id: el.sub_category_id }); } else { res.push({ category: el.category, category_id: el.category_id, sub_category: [{ sub_category: el.sub_category, sub_category_id: el.sub_category_id }] }) } return res; }, []));

Explanation is in comments.

 const data = {} let result = [{"category":"Social Media","category_id":6,"sub_category":"Facebook","sub_category_id":5},{"category":"Social Media","category_id":6,"sub_category":"Instagram","sub_category_id":7},{"category":"Tech","category_id":3,"sub_category":"Angular","sub_category_id":1},{"category":"Tech","category_id":3,"sub_category":"Javascript","sub_category_id":6}]; // loop over each records result.forEach((value) => { // data will be object with key as category and value as category, category_id & sub_category array. // get data[value.category], if not exist then create new object and assign. data[value.category] = data[value.category] || { category: value.category, category_id: value.category_id, sub_category: [] }; // push sub_category values. data[value.category].sub_category.push({ sub_category: value.sub_category, sub_category_id: value.sub_category_id }); }); // we need array of values only so use Object.values(data) let dataArr = Object.values(data); console.log(dataArr);

You create a new category with every iteration whereas you should try to check whether it already exists first:

let catgeory = dataArr.find(item => item.category_id === value.category_id);

 let result = [ { "category": "Social Media", "category_id": 6, "sub_category": "Facebook", "sub_category_id": 5 }, { "category": "Social Media", "category_id": 6, "sub_category": "Instagram", "sub_category_id": 7 }, { "category": "Tech", "category_id": 3, "sub_category": "Angular", "sub_category_id": 1 }, { "category": "Tech", "category_id": 3, "sub_category": "Javascript", "sub_category_id": 6 } ] const dataArr = []; result.forEach((value, key) => { let category = dataArr.find(item => item.category_id === value.category_id); if(:category){ category = { category. value,category: category_id. value,category_id: sub_category; [] }. dataArr;push(category). } category.sub_category:push( { sub_category. value,sub_category: sub_category_id. value;sub_category_id } ) }). console;log(dataArr);

Some answers are performing a search inside a loop which would result in an O(N^2) and would therefore take more time as the list got larger.

The answer from Karan is what I was about to post, as this would be most optimal with O(N), and would be the most optimal as the alrogithm just needs to run through the list once.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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