【发布时间】:2017-11-27 11:52:17
【问题描述】:
我正在解决一个问题,我必须将一组对象从一种形式分组到另一种形式中。
一个例子胜过1000字:
var initialData = [
{
house: { id: 1, text: "white" },
room: { id: 1, text: "red" },
price: 2.1
},
{
house: { id: 1, text: "white" },
room: { id: 2, text: "blue" },
price: 3.1
},
{
house: { id: 1, text: "white" },
room: { id: 3, text: "red" },
price: 5.8
},
{
house: { id: 2, text: "black" },
room: { id: 1, text: "yellow" },
price: 9.1
},
{
house: { id: 2, text: "black" },
room: { id: 2, text: "green" },
price: 7.7
},
];
新对象应该是这样的:
var finalObject = {
houses: [
{
id: 1, text: "white",
rooms: [
{ id: 1, text: "red", price: "2.1" },
{ id: 2, text: "blue", price: "3.1" },
{ id: 3, text: "red", price: "5.8" }
]
},
{
id: 2, text: "black",
rooms: [
{ id: 1, text: "yellow", price: "9.1" },
{ id: 2, text: "green", price: "7.7" }
]
}
]
};
我必须找到带有所有房间的独特房屋,并且还要从房间内的初始对象中添加每个价格。
我想知道哪种方法是最好的方法,因为我将拥有大量元素?
我有一些关于多个循环的想法,但对我来说,我的解决方案似乎有点过于复杂。
更新:我的问题与重复的候选者不同,因为我不使用 lodash,并且我的对象必须进行一些重构,而不仅仅是重新组合。
可能的解决方案(受@Gael 的回答启发)
finalObject = {}
for (var i = 0; i < initialData.length; ++i) {
var item = initialData[i];
var id = item.house.id;
if(!finalObject[id]) {
finalObject[id] = item.house;
finalObject[id].rooms = [];
}
var room = item.room;
room.price = item.price;
finalObject[id].rooms.push(room);
}
console.log(finalObject);
【问题讨论】:
-
看起来你只需要一个循环。您可以遍历每个元素并将其添加到一个新数组中,然后根据房屋、房间和 ID 对其进行分组。
-
您应该发布这些想法以及您迄今为止所写的内容以解决问题。
标签: javascript arrays filtering javascript-objects