kanishka kumarasiri
kanishka kumarasiri

Reputation: 153

JS creating new object array using another object

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}
            }            
         })

Upvotes: 1

Views: 57

Answers (2)

Dinesh Shaw
Dinesh Shaw

Reputation: 13

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);

Upvotes: 1

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>

Upvotes: 2

Related Questions