Hi guys i want to do something “simple” but not for me, I have this array
[ { x: 'bmw', vehicule_type: car, y: 1 }, { x: 'mercedes', vehicule_type: car, y: 2 }, { x: 'airbus', vehicule_type: plane, y: 1 } ]
And i want to transform it to this thing
[ car : [{ x: 'bmw', y: 1 }, { x: 'mercedes', y: 1 }] plane: [{ x: 'airbus', y: 1 }] ]
I cant find a way to do it, i saw that i could use “reducer()” but for the rest i’m lost
Advertisement
Answer
Presented below is one possible way to achieve the desired objective.
Code Snippet
const myTransform = arr => ( arr.reduce( (acc, {vehicule_type, ...rest}) => ( (acc[vehicule_type] ??= []).push({...rest}), acc ), {} ) ); /* EXPLANATION of the code // method to transform the array const myTransform = arr => ( arr.reduce( // iterate using ".reduce()" with "acc" as accumulator // destructure the iterator to acces "vehicule_type" (acc, {vehicule_type, ...rest}) => ( // if "acc" doesn't have "vehicule_type", set it as empty array // and then, push "rest" (ie, x, y, other props, if any) into the array (acc[vehicule_type] ??= []).push({...rest}), // implicit return of "acc" acc ), {} // initialize "acc" as an empty object ) ); */ const dataArr = [ { x: 'bmw', vehicule_type: 'car', y: 1 }, { x: 'mercedes', vehicule_type: 'car', y: 2 }, { x: 'airbus', vehicule_type: 'plane', y: 1 } ]; console.log(myTransform(dataArr));
.as-console-wrapper { max-height: 100% !important; top: 0 }
Explanation
Inline comments added to the snippet above.
EDIT
As noted by Bergi in a comment below, an alternative using for
loop is also possible. This may look something as shown below:
const myTransform = arr => { const res = {}; for (const {vehicule_type, ...rest} of dataArr) { (res[vehicule_type] ??= []).push({...rest}); }; return res; }; /* EXPLANATION // alternative method to transform the array const myTransform = arr => { // set up result "res" as an empty object "{}" const res = {}; // iterate over elts of "dataArr" // destructure the iterator to directly access "vehicule_type" for (const {vehicule_type, ...rest} of dataArr) { // if "vehicule_type" not already in "res", // then, set it with a value of empty array // push the remaining props "...rest" into the array (res[vehicule_type] ??= []).push({...rest}); }; // return the result return res; }; */ const dataArr = [ { x: 'bmw', vehicule_type: 'car', y: 1 }, { x: 'mercedes', vehicule_type: 'car', y: 2 }, { x: 'airbus', vehicule_type: 'plane', y: 1 } ]; console.log(myTransform(dataArr));
.as-console-wrapper { max-height: 100% !important; top: 0 }