Maison > Questions et réponses > le corps du texte
J'ai 3 objets
[ {name: 3, q: 10, b: 1}, {name: 5, q: 6, b: 2}, {name: 5, q: 7, b: 1} ]
Je dois les regrouper par nom :
[ {name: 3: items: [{q:10, b: 1}]}, {name: 5: items: [{q:6, b: 2}, {q:7, b: 1}]}, ]
Peut-être que Lodash a une solution subtile ?
P粉9285913832024-04-02 09:52:41
Vous pouvez utiliser Object.values< /a> combiné avec Array.prototype.reduce() et Array.prototype .push()
Code :
const data = [ { name: 3, q: 10, b: 1 }, { name: 5, q: 6, b: 2 }, { name: 5, q: 7, b: 1 }, ] const groupedData = Object.values( data.reduce((acc, obj) => { const { name, ...rest } = obj acc[name] = acc[name] || { name, items: [] } acc[name].items.push(rest) return acc }, {}) ) console.log(groupedData)
P粉8845486192024-04-02 09:31:42
Vous n'avez pas besoin de lodash, vous pouvez simplement utiliser JavaScript
const inputArray = [ {name: 3, q: 10, b: 1}, {name: 5, q: 6, b: 2}, {name: 5, q: 7, b: 1} ];
Utilisez forEach< /p>
function groupItemsByName(array) { // create a groups to store your new items const groups = {}; //loop through your array array.forEach(obj => { // destructure each object into name and the rest const { name, ...rest } = obj; // if the named group doesnt exist create that name with an empty array if (!groups[name]) { groups[name] = { name, items: [] }; } // add the items to the named group based on the name groups[name].items.push(rest); }); return Object.values(groups); } const transformedArray = groupItemsByName(inputArray);
Utilisez reduce et Object.values()< /p>
function groupItemsByName(array) { //Object.values returns an objects values as an array return Object.values( array.reduce((groups, obj) => { // destructure as in the forEach method const { name, ...rest } = obj; // create the groups like in the previous method groups[name] = groups[name] || { name, items: [] }; // push the items to the group based on the name groups[name].items.push(rest); return groups; }, {}) ); } const transformedArray = groupItemsByName(inputArray);
Utilisez cartes et réduisez
const transformedArray = Array.from( inputArray.reduce((map, obj) => { const { name, ...rest } = obj; const existing = map.get(name) || { name, items: [] }; existing.items.push(rest); return map.set(name, existing); }, new Map()).values() );
Sortie
console.log(transformedArray);