Array / Map /Object Transfer and Reshape Example
-
function groupBy(list, keyGetter) { const map = new Map(); list.forEach((item) => { const key = keyGetter(item); const collection = map.get(key); if (!collection) { map.set(key, [item]); } else { collection.push(item); } }); return map; } function strMapToObj(strMap) { let obj = Object.create(null); for (let [k,v] of strMap) { // We don’t escape the key '__proto__' // which can cause problems on older engines obj[k] = v; } return obj; } function objToStrMap(obj) { let strMap = new Map(); for (let k of Object.keys(obj)) { strMap.set(k, obj[k]); } return strMap; } // example usage const pets = [ {type:"Dog", name:"Spot"}, {type:"Cat", name:"Tiger"}, {type:"Dog", name:"Rover"}, {type:"Cat", name:"Leo"} ]; //use map to get new pets const grouped = groupBy(pets, pet => pet.type); const groupedObj = strMapToObj(grouped); // const groupedStr = JSON.stringify([...grouped]); // const groupedJson = JSON.parse(groupedStr); // console.log(JSON.stringify([...grouped])); // console.log(groupedJson);
-
Easier way
const groupBy = (items, key) => items.reduce( (result, item) => ({ ...result, [item[key]]: [ ...(result[item[key]] || []), item, ], }), {}, ); const pets = [ {type:"Dog", name:"Spot"}, {type:"Cat", name:"Tiger"}, {type:"Dog", name:"Rover"}, {type:"Cat", name:"Leo"} ]; const result = groupBy(pets, 'type'); console.log(result);