arrays - Transformar objeto de JavaScript
Esta simple (como antes, pensé) transformación de un objeto de JavaScript me derrota. Me gustaría aplanar este objeto de la siguiente manera.
Esto es lo que tengo:
{
"1": {
"group": "Clothes",
"brand": {
"0": {
"brand_id": "12",
"brand_name": "Adidas"
},
"1": {
"brand_id": "15",
"brand_name": "Zara"
}
}
},
"2": {
"group": "Cars",
"brand": {
"0": {
"brand_id": "43",
"brand_name": "Ferrari"
},
"1": {
"brand_id": "51",
"brand_name": "BMW"
}
}
}
}
Y esto es, lo que quiero conseguir
{0: {
brand_id: "12",
brand_name: "Adidas",
group: "Clothes",
}
1: {
brand_id: "15",
brand_name: "Zara",
group: "Clothes",
},
2: {
brand_id: "43",
brand_name: "Ferrari",
group: "Cars",
}
3: {
brand_id: "51",
brand_name: "BMW",
group: "Cars",
}}
Intenté usar .reduce() o .map() pero de manera ineficaz.
Respuesta #1
Puedes hacer:
const data = {1: {group: 'Clothes',brand: [{0: {brand_id: '12',brand_name: 'Adidas'}},{1: {brand_id: '15',brand_name: 'Zara'}}]},2: {group: 'Cars',brand: [{0: {brand_id: '43',brand_name: 'Ferrari'}},{1: {brand_id: '51',brand_name: 'BMW'}}]}};
const result = {};
Object.keys(data).forEach(k => {
data[k].brand.forEach((b, i) => {
result[Object.keys(result).length] = {
brand_id: b[i].brand_id,
brand_name: b[i].brand_name,
group: data[k].group
};
});
});
console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }Respuesta #2
Este objeto es algo raro, como los objetos similares a arrays, pero los índices comienzan desde 1, no desde 0, y carece de length.
Arregla primero algunos errores tipográficos, brand debería ser object, no array.
var objectOri = {
1: {
group: 'Clothes',
brand: {
0: {
brand_id: "12",
brand_name: "Adidas"
},
1: {
brand_id: "15",
brand_name: "Zara"
}
}
},
2: {
group: 'Cars',
brand: {
0: {
brand_id: "43",
brand_name: "Ferrari"
},
1: {
brand_id: "51",
brand_name: "BMW"
}
}
}
};
let arr = [];
Object.keys(objectOri).forEach(index => {
let brand = objectOri[index].brand;
Object.keys(brand).forEach(brIndex => {
arr.push({
...brand[brIndex],
group: objectOri[index].group
});
});
});
console.log(Object.assign({}, arr))
Además, si este objeto es un objeto similar a un arreglo, la clave debe comenzar desde 0, no desde 1, y la longitud también es necesaria, como se muestra a continuación.
var objectOri = {
0: {
group: 'Clothes',
brand: {
0: {
brand_id: "12",
brand_name: "Adidas"
},
1: {
brand_id: "15",
brand_name: "Zara"
},
length: 2
}
},
1: {
group: 'Cars',
brand: {
0: {
brand_id: "43",
brand_name: "Ferrari"
},
1: {
brand_id: "51",
brand_name: "BMW"
},
length: 2
}
},
length: 2
};
let arr = [];
Array.from(objectOri).forEach(item => {
Array.from(item.brand).forEach(brand => {
arr.push({
...brand,
group: item.group
});
});
});
console.log(Object.assign({}, arr))
