次のような一連の JSON ファイルを含むフォルダーがあります。
|
|-foo.json
|-bar.json
|-qux.json
|-baz.json
|-zot.json
children
各 JSON ファイルには、他の JSON ファイルのいくつかを指すプロパティがあるため、それらはすべてツリーを記述します。ここで、これが foo.json であるとします。
foo.json
{
"id": "foo",
...
"children": [
"bar.json",
"baz.json"
]
...
}
bar.json にはchildren
プロパティがなく、これが baz.json であるとします。
baz.json
{
"id": "baz",
...
"children": [
"zot.json"
]
...
}
特定の JSON ファイルの子孫を一覧表示する Node プログラムを作成しようとしています。foo.json
forを出力する必要があることを意味します[bar, baz, zot]
。
fs-extraを使用して JSON ファイルを読み取ります。
これを同期的に行っていた場合、次のように記述します。
const fs = require('fs-extra');
var descendants = ["foo.json"];
for(var k = 0; k < descendants.length; k++){
var obj = fs.readJsonSync(descendants[k]);
if(obj.children) descendants.concat(obj.children);
}
return descendants;
注:簡単にするために、スクリプトは json ファイルがあるディレクトリのルートで実行されると仮定します。
しかし、私は約束を使ってこれをしたいと思います。私の問題はdescendants
、もちろんループが同期的であるため、ループが終了する前に各ファイルの約束を解決して結果を変数に追加できないように見えることです。
約束を使用してこれを行う適切な方法は何ですか? 特に、Q.jsを組み合わせて使用し、reduce
これを支援しようとしてきましたが、これまでのところコードを適切に記述することができませんでした。