Intenté buscar en preguntas anteriores pero no pude encontrar la respuesta, así que aquí hay una pregunta muy genérica.
Tengo una matriz multidimensional así:
array = [ [ "1", "2013-14" , 1234], [ "2", "2013-14", 2345], [ "1", "2014-15" , 5234], [ "2", "2014-15", 7345], ]Estoy tratando de cambiarlo a un objeto anidado según el año:
obj = { "2013-14": { 1: "1234", 2: "2345" }, "2014-15": { 2: "5234", 2: "7345" } }Intenté esto, que dio una solución similar pero incorrecta:
let obj = {} for (let i = 0; i < array.length; i++) { obj[array[i][1]] = { [array[i][0]]: array[i][2] } }la solución que obtuve:
obj = { "2013-14": { 2: "2345" }, "2014-15": { 2: "7345" } }entonces, en lugar de concatenar valores bajo la misma clave, que en este caso es el año, lo anula y guarda el último
Debe respetar el objeto para cada fecha.
const array = [["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345]], obj = {}; for (let i = 0; i < array.length; i++) { obj[array[i][1]] ??= {}; obj[array[i][1]][array[i][0]] = array[i][2]; } console.log(obj);Un enfoque más corto con la desestructuración
const array = [["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345]], obj = {}; for (const [inner, outer, value] of array) { obj[outer] ??= {}; obj[outer][inner] = value; } console.log(obj);Creo que el problema es que está intentando acceder a objetos dentro de la clave que acaba de inicializar. El código está escribiendo los datos que deseaba, pero como está accediendo a la misma clave varias veces, los datos se sobrescriben.
Probé el siguiente enfoque en Python y funcionó:
data = [ [ "1", "2013-14" , 1234], [ "2", "2013-14", 2345], [ "1", "2014-15" , 5234], [ "2", "2014-15", 7345], ] # EXTRACT KEYS TO INITIALIZE OBJECT AND INSERT VALUES LATER keys=[] for i in data : if i[1] not in keys: keys.append(i[1]) parsed_obj = {k:{} for k in keys} for i in data : parsed_obj[i[1]][i[0]] = i[2] print(parsed_obj)Producción :
{'2013-14': {'1': 1234, '2': 2345}, '2014-15': {'1': 5234, '2': 7345}}Sé que no es ideal, pero tal vez alguien pueda ayudarlo a traducir esto a JS.
puede usar el operador de propagación {...} para concatarlo.
Aquí está el código:
var array = [ ["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345], ]; let obj = {}; for (let i = 0; i < array.length; i++) { obj[array[i][1]] = { ...obj[array[i][1]], [array[i][0]]: array[i][2] }; } console.log(obj);