I am trying to merge data on any duplicate key but also rewrite the data object.
I am trying to merge the array of values depending on if each object has the same 'time'. After which, I would like to pair each value within the items with the name.
I think the easiest way to show is through the raw data I hope to transform, So I would like to transform the following;
var data = [{
"item": ["1", "2"],
"time": "12-15",
"name": "ben"
}, {
"item": ["3", "4"],
"time": "12-15",
"name": "bill"
}, {
"item": ["1", "2", "3"],
"time": "15-18",
"name": "ben"
}, {
"item": ["4", "5", "6"],
"time": "15-18",
"name": "bill"
}];
Into
var result = [{
"time": "12-15",
"ben": ["1", "2"],
"bill": ["3", "4"]
},
{
"time": "15-18",
"ben": ["1", "2", "3"],
"bill": ["4", "5", "6"]
}]
I have been trying to this this question to help me do this however I'm not getting very far. I cannot seem to resolve the issue of the first item that is checked not being output as an array.
Any help is much appreciated!
var data = [{
"item": ["1", "2"],
"time": "12-15",
"name": "ben"
}, {
"item": ["3", "4"],
"time": "12-15",
"name": "bill"
}, {
"item": ["1", "2", "3"],
"time": "15-18",
"name": "ben"
}, {
"item": ["4", "5", "6"],
"time": "15-18",
"name": "bill"
}];
var seen = {};
var result = data.filter(function(entry) {
var previous;
// Have we seen this label before?
if (seen.hasOwnProperty(entry.time)) {
// Yes, grab it and add this data to it
previous = seen[entry.time];
previous.item.push(entry.item);
// Don't keep this entry, we've merged it into the previous one
return false;
}
//console.log(seen)
// entry.data probably isn't an array; make it one for consistency
if (!Array.isArray(entry.item)) {
entry.item = [entry.item];
}
// Remember that we've seen it
seen[entry.time] = entry;
// Keep this one, we'll merge any others that match into it
return true;
});
console.log(result)