Reputation: 3871
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
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
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