Data is useless unless it is well structured. I want to convert array of objects into a more meaningfully structured object via vanilla JavaScript and by this - to lessen entropy in the world :)
Companies' values form nested named arrays as well as vehicles' values form nested named objects. The hardest task was to set if-statements dynamically. I got stuck in the end of the code, yet, hoping that a JS professional could help me out.
// Source data format
var inputs = [
{"vehicle":"car", "company":"Toyota", "model":"Corolla"},
{"vehicle":"car", "company":"Toyota", "model":"Rav4"},
{"vehicle":"car", "company":"Toyota", "model":"Camry"},
{"vehicle":"car", "company":"Chevrolet", "model":"Malibu"},
{"vehicle":"car", "company":"Chevrolet", "model":"Camaro"},
{"vehicle":"rocket", "company":"Tesla", "model":"SpaceX"}
];
// Target data format
const data = {
car:{
Toyota:[
{"vehicle"="car","company"="Toyota", "model"="Corolla"},
{"vehicle"="car","company"="Toyota", "model"="Rav4"},
{"vehicle"="car","company"="Toyota", "model"="Camry"}
],
Chevrolet:[
{"vehicle"="car","company"="Chevrolet", "model"="Malibu"},
{"vehicle"="car","company"="Chevrolet", "model"="Camaro"}
]
},
rocket:{
Tesla:[
{"vehicle"="rocket","company"="Tesla", "model"="SpaceX"}
]
}
};
// Unfinished solution
// Get all vehicle names.
var vehicles = [];
for (var [key, obj] of inputs.entries()) {
vehicles.push(obj.vehicle);
}
// Single out only unique vehicle names.
var uniqueVehicles = [...new Set(vehicles)];
// Get all company names.
var arr = [];
for (var [key, obj] of inputs.entries()) {
arr.push(obj.company);
}
// Single out only unique company names.
var uniqueCompanies = [...new Set(arr)];
// Group objects into arrays by company names.
var dataProperties = {};
for (var comp of uniqueCompanies) {
dataProperties[comp] = inputs.filter(obj => obj.company === comp);
}
// Group objects into arrays by vehicle names.
var data = {};
for (var vehi of uniqueVehicles) {
data[vehi] = inputs.filter(o => o.vehicle === vehi);
}
// data;
// dataProperties;