He estado usando el método reduce() para agrupar por estados de apertura y cierre ( Status_111 , Status_222 , etc.) que luego crea una matriz de los Id ( item.Id ) con los que está asociado.
El código está funcionando y con un resultado esperado, pero ¿cómo evito la verificación duplicada cuando de alguna manera hace algo similar y crea matrices en blanco (los estados de apertura y cierre pueden tener la misma identificación (por ejemplo, Status_111 ), me refiero a esta sección de bloque:
if (item.Open && !obj[item.Open]) { obj[item.Open] = { Open: [], Close: [] } } if (item.Close && !obj[item.Close]) { obj[item.Close] = { Open: [], Close: [] } }Uso:
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));Una reduce con un forEach es una forma de llegar allí.
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)