Javascript - refactor array - array reduce

80 Views Asked by At

What is the best way to refactor(ise) an array / array of objects ? I was thinking of using array.reduce, but could not figure out a solution.

for example, transform this array :

const carsInput =
     [
        {
            brand: 'volkswagen',
            model: 'golf',
            motorSpec: {
                ...
            },
            Dim: {
                ...
            },
        },
...
        {
            brand: 'volkswagen',
            model: 'passat',
            motorSpec: {
                ...
            },
            Dim: {
                ...
            },
        },
    ]

to this array of objects

const carsOutput =
    {
        volkswagen: {
            brandName: 'volkswagen',
            models: {
                golf: {
                    modelName: 'golf',
                    motorSpec: {
                       ...
                    },
                    Dim: {
                       ...
                    },
                },
                passat: {
                    modelName: 'passat',
                    motorSpec: {
                        ...
                    },
                    Dim: {
                        ...
                    },
                },
            },
        },
    }

Also if you think of another (better) way of presenting this array of objects, I am all ears ! Thanks a lot

1

There are 1 best solutions below

1
On BEST ANSWER

I am sure others have more concise ways of doing this but here is one approach.

const carsInput =
     [{
            brand: 'ford',
            model: 'mustang',
            motorSpec: {
            },
            Dim: {
            }
        },
        {
            brand: 'volkswagen',
            model: 'golf',
            motorSpec: {
            },
            Dim: {
            }
        },
        {
            brand: 'volkswagen',
            model: 'passat',
            motorSpec: {
            },
            Dim: {
            }
        },
    ];
    
const carsOutput = new Object();

function initializeMake(makeName) {
  carsOutput[makeName] = { brandName: makeName, models: {}};
  return carsOutput[makeName]
}

carsInput.forEach(car => {
    let make = carsOutput[car.brand] || initializeMake(car.brand);

    const modelDefinition = { 
    'modelName': car['model'],
    'motorSpec': car.motorSpec,
    'Dim': car.Dim
  };
  
    make.models[car.model] = modelDefinition;
});

console.log(carsOutput)