Home > Software design >  JS creating new object array using another object
JS creating new object array using another object

Time:07-13

I have below object array

var testdata = [{
                 TYPE: 'type 1', Category: 'Booking', Count : 5
               },
               {
                 TYPE: 'type 2', Category: 'Booking', Count : 15
               },
               {
                 TYPE: 'type 1', Category: 'Planning', Count : 10
               },
               {
                 TYPE: 'type 3', Category: 'SALES', Count : 5
               }]

I want to group each category and then by type and count as below:

 var resultdata =
    {
     "Booking": {
       "type 1": 5,
       "type 2": 15
     },
    "Planning": {
       "type 1": 10
     },
    "SALES": {
       "type 3": 5
     },
    }

so far I have written bellow logic but it fails to give me expected result it is only adding the last values of each category

 $.each(testdata , function (key, value) {
            if(value.Category == "Booking"){
                bookingarray['Booking'] = {[value.TYPE]: value.Count}
            }            
         })

CodePudding user response:

You could try something like this:

$.each(testdata, function(key, value) {
  if (!bookingarray[value.Category]) {
    bookingarray[value.Category] = {} // if example "Booking" does not exist in resultData, then create it
  }
  bookingarray[value.Category][value.TYPE] = value.Count
})

Demo

var testdata = [{
    TYPE: 'type 1',
    Category: 'Booking',
    Count: 5
  },
  {
    TYPE: 'type 2',
    Category: 'Booking',
    Count: 15
  },
  {
    TYPE: 'type 1',
    Category: 'Planning',
    Count: 10
  },
  {
    TYPE: 'type 3',
    Category: 'SALES',
    Count: 5
  }
]

var bookingarray = {};

$.each(testdata, function(key, value) {
  if (!bookingarray[value.Category]) {
    bookingarray[value.Category] = {}
  }
  bookingarray[value.Category][value.TYPE] = value.Count
})

console.log(bookingarray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

CodePudding user response:

const testdata = 
        [{
           TYPE: 'type 1', Category: 'Booking', Count : 5
         },
         {
           TYPE: 'type 2', Category: 'Booking', Count : 15
         },
         {
           TYPE: 'type 1', Category: 'Planning', Count : 10
         },
         {
           TYPE: 'type 3', Category: 'SALES', Count : 5
         }];
    

let categories = new Set(testdata.map(t => t.Category));
let resultData = {};

categories.forEach(c => testdata.map(t => {
  if (t.Category === c) {
      if(resultData[c]) resultData [c][t.TYPE] = t.Count;
      else resultData = { ...resultData , [c]: { [t.TYPE]: t.Count } }; 
  }
}));

console.log(resultData);

  • Related