Supongamos que tengo la siguiente matriz JSON:
[ { "MainCategory": "1", "SubCategory": "a", "Value": "val1" }, { "MainCategory": "1", "SubCategory": "a", "Value": "val2" }, { "MainCategory": "1", "SubCategory": "b", "Value": "val3" }, { "MainCategory": "2", "SubCategory": "a", "Value": "val4" }, { "MainCategory": "2", "SubCategory": "b", "Value": "val5" }, { "MainCategory": "2", "SubCategory": "b", "Value": "val6" } ]Y me gustaría convertirlo en el siguiente objeto multidimensional en JavaScript (sin Lodash):
{ "1":{ "a": [ "val1", "val2" ], "b": [ "val3" ] }, "2":{ "a": [ "val4" ], "b": [ "val5", "val6" ] } } Me imagino que puedo hacerlo con un foreach , pero estoy tratando de hacerlo usando la función de reduce (ESPERANDO que sea la correcta para usar aquí) y simplemente no obtengo la sintaxis correcta.
Mi GUESS actual (no funciona) es algo así como:
const newJson = CurrentJson.reduce((result, {MainCategory, SubCategory, Value}) => { (result[MainCategory][SubCategory] = result[MainCategory][SubCategory] || []) .push(Value); return result; }, {});¿Cómo puedo hacer esto?
Puede usar un reductor para iterar sobre el JSON original y construir el nuevo objeto.
const json = [ { "MainCategory": "1", "SubCategory": "a", "Value": "val1" }, { "MainCategory": "1", "SubCategory": "a", "Value": "val2" }, { "MainCategory": "1", "SubCategory": "b", "Value": "val3" }, { "MainCategory": "2", "SubCategory": "a", "Value": "val4" }, { "MainCategory": "2", "SubCategory": "b", "Value": "val5" }, { "MainCategory": "2", "SubCategory": "b", "Value": "val6" } ] const newJson = json.reduce((prev, curr) => { // Check for the MainCategory first if (prev[curr.MainCategory] === undefined) { prev[curr.MainCategory] = { [curr.SubCategory]: [] // Add the SubCategory key and define as empty array } } // Check if we have the SubCategory if (prev[curr.MainCategory][curr.SubCategory] === undefined) { prev[curr.MainCategory][curr.SubCategory] = [] // define as empty array } // Push the Value prev[curr.MainCategory][curr.SubCategory].push(curr.Value) return prev }, {}) console.log(newJson)Puede usar reducir de la siguiente manera;
var data = [ { "MainCategory": "1" , "SubCategory": "a" , "Value": "val1" } , { "MainCategory": "1" , "SubCategory": "a" , "Value": "val2" } , { "MainCategory": "1" , "SubCategory": "b" , "Value": "val3" } , { "MainCategory": "2" , "SubCategory": "a" , "Value": "val4" } , { "MainCategory": "2" , "SubCategory": "b" , "Value": "val5" } , { "MainCategory": "2" , "SubCategory": "b" , "Value": "val6" } ], res = data.reduce((r,o) => ( r[o.MainCategory] ? r[o.MainCategory][o.SubCategory] ? r[o.MainCategory][o.SubCategory].push(o.Value) : r[o.MainCategory][o.SubCategory] = [o.Value] : r[o.MainCategory] = {[o.SubCategory]: [o.Value]} , r ) ,{}); console.log(res);