var result = arr.reduce((res, item) => { if (res[item.grandpa] == null) { res[item.grandpa] = {} } if (res[item.grandpa][item.parent] == null) { res[item.grandpa][item.parent] = [] } res[item.grandpa][item.parent].push(item) return res }, {})