export const groupByQuadrants = (items) => ( items.reduce((quadrants, item) => ({ ...quadrants, [item.quadrant]: addItemToQuadrant(quadrants[item.quadrant], item), }), {}) ); export const groupByRing = (items) => ( items.reduce((rings, item) => ({ ...rings, [item.ring]: addItemToList(rings[item.ring], item), }), {}) ); export const groupByFirstLetter = (items) => { const index = items.reduce((letterIndex, item) => ({ ...letterIndex, [getFirstLetter(item)]: addItemToList(letterIndex[getFirstLetter(item)], item), }), {}); return Object.keys(index).sort().map((letter) => ({ letter, items: index[letter], })); } const addItemToQuadrant = (quadrant = {}, item) => ({ ...quadrant, [item.ring]: addItemToRing(quadrant[item.ring], item), }); const addItemToList = (list = [], item) => ([ ...list, item, ]); const addItemToRing = (ring = [], item) => ([ ...ring, item, ]); export const getFirstLetter = (item) => item.title.substr(0,1).toUpperCase();