Tengo JSON con la siguiente estructura como entrada:
{ "143334": ["VW", "Golf", "Diesel or Gas", "Affordable", "Blue, red or white"], "344389": ["VW", "Passat", "Diesel or Gas", "More expensive"], "484612": ["Audi", "A8", "Diesel", "Premium"], "234234": ["Renault", "Megane", "not too much info"] }Hay una identificación única como clave, y como valor hay una variedad de marcas, modelos y características.
Lo que se necesita es crear una función de JavaScript que, cuando reciba esta entrada, devuelva como salida una matriz ordenada de marcas y modelos, siendo los modelos otra matriz ordenada de modelo, identificación única y características.
La salida para la entrada anterior debe ser:
[ { "brand": "Audi", "models": [ { "model": "A8", "id": "484612", "characteristics": ["Diesel", "Premium"] } ] }, { "brand": "Renault", "models": [ { "model": "Megane", "id": "234234", "characteristics": ["not too much info"] } ] }, { "brand": "VW", "models": [ { "model": "Golf", "id": "143334", "characteristics": ["Diesel or Gas", "Affordable", "Blue, red or white"] }, { "model": "Passat", "id": "344389", "characteristics": ["Diesel or Gas", "More expensive"] } ] } ]En primer lugar, analicé la entrada, luego traté de mapearla como si fuera una matriz para construir el resultado. No tengo ni idea de cómo ordenarlo alfabéticamente por marca y por modelos:
function doMagic(input) { const result = []; const parsedInput = JSON.parse(input); for (const brand in parsedInput) { result.push({"brand": brand[0], "models": brand[1], "id": brand}); } return result; }Primero debe verificar si la marca ya está en la matriz y (después de crearla) insertar el nuevo modelo en la matriz.
let json = '{"143334": ["VW", "Golf", "Diesel or Gas", "Affordable", "Blue, red or white"],"344389": ["VW", "Passat", "Diesel or Gas", "More expensive"],"484612": ["Audi", "A8", "Diesel", "Premium"],"234234": ["Renault", "Megane", "not too much info"]}'; function doMagic(json) { let res = []; let arr = JSON.parse(json) Object.keys(arr).forEach(k => { let tempIndex = res.findIndex(r => r.brand === arr[k][0]) if(-1 === tempIndex) { // if the brand isn't in the array yet tempIndex = res.push({ brand:arr[k][0], models:[] })-1 } res[tempIndex].models.push({ "model": arr[k][1], "id": k, "characteristics": arr[k].slice(2) }) }) res.sort((a,b) => a.brand.localeCompare(b.brand)) res.forEach(e => e.models.sort((a,b) => a.model.localeCompare(b.model))) return res } console.log(doMagic(json))Puedes hacerlo.
let jsonObj = '{"143334": ["VW", "Golf", "Diesel or Gas", "Affordable", "Blue, red or white"],"344389": ["VW", "Passat", "Diesel or Gas", "More expensive"],"484612": ["Audi", "A8", "Diesel", "Premium"],"234234": ["Renault", "Megane", "not too much info"]}'; function doMagic(input) { const parsedInput = JSON.parse(input); var ids = Object.keys(parsedInput); var mappingObj = {}; for(let id of ids){ if(mappingObj[parsedInput[id][0]]){ mappingObj[parsedInput[id][0]].push({ model:parsedInput[id][1], id:id, characteristics:parsedInput[id].slice(2) }) }else{ mappingObj[parsedInput[id][0]]= [ { model:parsedInput[id][1], id:id, characteristics:parsedInput[id].slice(2) } ] } } var brands = Object.keys(mappingObj) brands.sort(function(a,b){ if(a>b){return 1;} else if(a<b){return -1;} else {return 0;} }) var finalObj = []; for(var i=0;i<brands.length;i++){ mappingObj[brands[i]].sort(function(a,b){ if(a.model>b.model){return 1;} else if(a.model<b.model){return -1;} else {return 0;} }) finalObj.push({ brand:brands[i], models:mappingObj[brands[i]] }) } return finalObj; } console.log(doMagic(jsonObj))