私はオブジェクトの配列をあるフォームから別のフォームにグループ化する必要があるという問題に取り組んでいます。パフォーマンスのあるJavaScriptオブジェクトの再編成
の例では、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を使用しないため、私の質問は重複の候補と同じではなく、私のオブジェクトはちょうど再グループ化されずにリファクタリングされなければなりません。
解決策(@ガエルの答えに触発)
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に基づいてグループ化することができます。 – victor
問題を解決するために、これまでに書いたアイデアや投稿を投稿してください。 – chazsolo
[オブジェクトの配列をキーでグループ化する方法](https:// stackoverflow。com/questions/40774697/how-to-groups-by-key) –