简体   繁体   中英

JSON complex nested array sort using order

I have a complex nested JSON array and I want to sort it from inside and outside level using itemsortorder from outside level and subitemnameorder from.inside level

My given Array below


    id:1,
    "fruits":[
        {
        "itemid":1,
        "itemname":"Red Fruits",
        "itemsortorder":2,
        "subitems":[ {"subitemname":"Apple", "subitemnameorder":2},
                     {"subitemname":"Grapes", "subitemnameorder":1},
                     {"subitemname":"Berryberry", "subitemnameorder":3}
                   ]
        },
        {
        "itemid":2,
        "itemname":"Yellow Fruits",
        "itemsortorder":1,
        "subitems":[ {"subitemname":"Orange", "subitemnameorder":3},
                     {"subitemname":"Gua", "subitemnameorder":1},
                     {"subitemname":"Mango", "subitemnameorder":2}
                   ]
        }

    ],
    "Vegetable":[
        {
        "itemid":3,
        "itemname":"Red Veggies",
        "itemsortorder":2,
        "subitems":[ {"subitemname":"Onion", "subitemnameorder":2},
                     {"subitemname":"Ginger", "subitemnameorder":1},
                     {"subitemname":"Carrot", "subitemnameorder":3}
                   ]
        },
        {
        "itemid":4,
        "itemname":"Small Veggies",
        "itemsortorder":1,
        "subitems":[ {"subitemname":"pepper", "subitemnameorder":3},
                     {"subitemname":"halo", "subitemnameorder":1},
                     {"subitemname":"good", "subitemnameorder":2}
                   ]
        },
        {
        "itemid":5,
        "itemname":"Cool",
        "itemsortorder":3,
        "subitems":[ {"subitemname":"abc", "subitemnameorder":3},
                     {"subitemname":"pqr", "subitemnameorder":1},
                     {"subitemname":"kooi", "subitemnameorder":2}
                   ]
        }

    ],

    "avoid":[
    {
        "itemid":3,
        "itemname":"avoid Veggies",
        "itemsortorder":2,
        "subitems":[ {"subitemname":"Onion", "subitemnameorder":2},
                     {"subitemname":"Ginger", "subitemnameorder":1},
                     {"subitemname":"Carrot", "subitemnameorder":3}
                   ]
        }]
}

Avoid the avoid array part

Expected


   {  
      "filename":"Yellow Fruits",
      "children":[  
         {  
            "filename":"Gua",
            "subitemnameorder":1
         },
         {  
            "filename":"Mango",
            "subitemnameorder":2
         },
         {  
            "filename":"Orange",
            "subitemnameorder":3
         }
      ]
   },
   {  
      "filename":"Red Fruits",
      "children":[  
         {  
            "filename":"Grapes",
            "subitemnameorder":1
         },
         {  
            "filename":"Apple",
            "subitemnameorder":2
         },
         {  
            "filename":"Berryberry",
            "subitemnameorder":3
         }
      ]
   },
   ,
   {  
      "filename":"Small Veggies",
      "children":[  
         {  
            "filename":"halo",
            "subitemnameorder":1
         },
         {  
            "filename":"good",
            "subitemnameorder":2
         },
         {  
            "filename":"pepper",
            "subitemnameorder":3
         }
      ]
   },
   {  
      "filename":"Red Veggies",
      "children":[  
         {  
            "filename":"Ginger",
            "subitemnameorder":1
         },
         {  
            "filename":"Carrot",
            "subitemnameorder":2
         },
         {  
            "filename":"Onion",
            "subitemnameorder":3
         }
      ]
   },
   {  
      "filename":"Cool",
      "children":[  
         {  
            "filename":"pqr",
            "subitemnameorder":1
         },
         {  
            "filename":"kooi",
            "subitemnameorder":2
         },
         {  
            "filename":"abc",
            "subitemnameorder":3
         }
      ]
   }
   ]

First it should take from fruits and sort accordingly then take from vegetables and follow

I have tried with filter and map but not working. Please help.

I tried below function pls look fiddle

https://jsfiddle.net/qb2pueg7

I assume you will be assigning the json to variable data so the code follows as below

let keysarr = Object.keys(data);
let temp = [];
  for(let i=0;i<keysarr.length;i++){
    if(keysarr[i]!=="id" && keysarr[i]!=="avoid"){
     let tempsortL1 = data[keysarr[i]].
      sort((a,b)=>a.itemsortorder-b.itemsortorder).map((item)=>{
                let retObj={};
              retObj["filename"] = item.itemname;
              retObj["children"]=item.subitems.sort((a,b)=>a.subitemnameorder-b.subitemnameorder); 
          temp.push(retObj);
          return retObj;});

 }
};

Your required array will come to temp . Sorry if you feel code is unformatted I tried to maintain not considering the keys in sorting. Here is the fiddle https://jsfiddle.net/pv2sLejc/ Also attaching the image of console 在此处输入图片说明

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