I have been using reduce() method to group by Open and Closes statuses (Status_111, Status_222, etc) which then creates an array of which Ids (item.Id) it is associated with.
Code is working and with an expected result but how do I avoid duplicated check when somewhat it does a similar thing and create blank arrays (Open and Close Status can have same Id (eg: Status_111), I am referring to this block section:
if (item.Open && !obj[item.Open]) {
obj[item.Open] = {
Open: [],
Close: []
}
}
if (item.Close && !obj[item.Close]) {
obj[item.Close] = {
Open: [],
Close: []
}
}
Usage:
const items = [
{ Id: 100, Open: 'Status_111', Close: 'Status_111' },
{ Id: 200, Open: 'Status_111', Close: 'Status_222' },
{ Id: 300, Open: 'Status_333', Close: 'Status_444' }
]
function groupByOpenAndClose(items) {
return items.reduce(function (obj, item) {
if (item.Open && !obj[item.Open]) {
obj[item.Open] = {
Open: [],
Close: []
}
}
if (item.Close && !obj[item.Close]) {
obj[item.Close] = {
Open: [],
Close: []
}
}
if (obj[item.Open]) {
obj[item.Open].Open.push(item.Id)
}
if (obj[item.Close]) {
obj[item.Close].Close.push(item.Id)
}
return obj
}, {});
}
console.log(groupByOpenAndClose(items));
A reduce with a forEach is one way to get there
const items = [{
Id: 100,
Open: 'Status_111',
Close: 'Status_111'
},
{
Id: 200,
Open: 'Status_111',
Close: 'Status_222'
},
{
Id: 300,
Open: 'Status_333',
Close: 'Status_444'
}
]
let status = items.reduce((b, a) => {
['Open', 'Close'].forEach(s => {
b[a[s]] = b[a[s]] || {Open: [], Close: []}
});
return b
}, {});
items.forEach(s => {
status[s.Open].Open.push(s.Id);
status[s.Close].Close.push(s.Id)
});
console.log(status)