私は私のフォームの構造体のベクトルを与え、データベースからデータセットを引っ張ってるのリストに親IDを持つ構造体のリストを変換:木
struct Foo {
id: i32,
parent: Option<i32>,
data: String,
}
私はシリアル化して出力したいですベクトルとして、このデータのネストされたバージョンをJSONに:
struct Bar {
id: i32,
data: String,
children: Option<Vec<Bar>>,
}
私が原因再帰的な性質のために、この実施のまわりで私の頭をラップするいくつかの問題を抱えています。イテレータを使用して問題を1つ下に解決できますが、同じベクトル上で再び繰り返したいときに壁に当たっています。例えば
、ハッシュマップにIDSにちょうど巣の子供たちを試みるVec<Foo>
の方法:
fn build_tree(&self) -> HashMap<i32, Vec<i32>> {
let mut tree = HashMap::new();
for node in self.iter() {
if let Some(parent) = node.parent {
let leaf = tree.entry(parent).or_insert(Vec::new());
leaf.push(node.id);
}
}
tree
}
利回り
{14: [15], 3: [14], 1: [2, 17], 2: [16, 18], 18: [19], 19: [20]}
しかし、私が必要とすることは、より深いものになるだろう:
{3: [14: [15]], 1: [2: [16, 18: [19: [20]]], 17]}
から読んでくださいthis post再帰を回すことについてeアイデアを反復コードに組み込むことは、そのような実装が可能であることを示唆していますが、私はその問題からアイデアを取り出してここに適用することが困難でした。
Vec<Foo>
をVec<Bar>
に変換する方法を説明できる人はいますか?私は反復的または再帰的な提案に満足しています。私は自分で再帰を試みたときに、借用と参照に関して多くの問題を抱えていました。
@trentcl:私は再帰的な提案にも満足しています。私は自分自身でそのルートを試したときに、借用と参照に関して多くの問題を抱えていました。 – Geodesic