Marcelo Tataje
Marcelo Tataje

Reputation: 3871

Javascript (ExtJS) iterate through object array, find duplicates and summarize into new object

I've been working with JS (ExtJS) for a while and I'm trying to do the following, assuming this array of objects:

Array Tickets:
[0]{ticket: 'TICKET1', associated_val: 'AB'}
[1]{ticket: 'TICKET1', associated_val: 'XY'}
[2]{ticket: 'TICKET1', associated_val: 'CD'}
[3]{ticket: 'TICKET2', associated_val: 'YZ'}
[4]{ticket: 'TICKET2', associated_val: 'EF'}
[5]{ticket: 'TICKET3', associated_val: 'AB'}
[6]{ticket: 'TICKET4', associated_val: null}

I want to obtain the following:

Summarized Array:
[0]{ticket: 'TICKET1', associated_val_array: ['AB', 'XY', 'CD']}
[1]{ticket: 'TICKET2', associated_val_array: ['YZ', 'EF']}
[2]{ticket: 'TICKET3', associated_val_array: ['AB']}
[3]{ticket: 'TICKET4', associated_val_array: []}

I'm trying to do this finding the duplicates, but it only comes to my mind is something similar to this:

var summarizedArray = [];
        for (var i = 0; i < data.length -1; i++) {
            if (data[i+1].ticket == data[i].ticket) {
                var myObj = {};
                var associated_val_array =[];
                associated_val_array.push(data[i].associated_val);
                myObj.set('ticket', data[i].ticket);
                myObj.set('associated_val_array', associated_val_array);
                summarizedArray.push(myObj);
            } 
        }

But I'm kind of blocked on how to make this works to obtain the summarized array.

Any help will be appreciated.

Thanks in advance.

Upvotes: 1

Views: 154

Answers (2)

elclanrs
elclanrs

Reputation: 94101

You can grab unique tickets first:

var tickets = data.map(function(obj) {
  return obj.ticket
}).filter(function(ticket, i, xs) {
  return xs.indexOf(ticket) === i
})

Then do a filter to match the ticket property and map the values:

var result = tickets.map(function(ticket) {
  return {
    ticket: ticket,
    associated_val_array: data.filter(function(obj) {
      return obj.ticket === ticket && obj.associated_val != null
    }).map(function(obj) {
      return obj.associated_val
    })
  }
})

Upvotes: 0

Arun P Johny
Arun P Johny

Reputation: 388316

You can do something like

var array = [{
  ticket: 'TICKET1',
  associated_val: 'AB'
}, {
  ticket: 'TICKET1',
  associated_val: 'XY'
}, {
  ticket: 'TICKET1',
  associated_val: 'CD'
}, {
  ticket: 'TICKET2',
  associated_val: 'YZ'
}, {
  ticket: 'TICKET2',
  associated_val: 'EF'
}, {
  ticket: 'TICKET3',
  associated_val: 'AB'
}, {
  ticket: 'TICKET4',
  associated_val: null
}];

var newarray = [],
  tmp = {},
  item;
for (var i = 0; i < array.length; i++) {
  item = array[i];
  if (!tmp[item.ticket]) {
    tmp[item.ticket] = {
      ticket: item.ticket,
      associated_val_array: []
    };
    newarray.push(tmp[item.ticket]);
  }
  if (item.associated_val != null) {
    tmp[item.ticket].associated_val_array.push(item.associated_val);
  }
}

console.log(newarray)

Upvotes: 2

Related Questions