Upload
kiyoshi-sawada
View
39
Download
3
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #24
Global ストレージの JavaScript 用の抽象化 (d) ドキュメントの末端ノードを渡り歩く
M/Gateway Developments Ltd.Rob Tweed
訳 : 日本ダイナシステム株式会社 嶋 芳成
2
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
ドキュメントの全節 ( ノード ) を渡り歩くのは大変
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachChild(function(nodeName,childNode) { childNode.forEachChild(function(nodeName, childNode) { childNode.forEachChild(function(nodeName, childNode) { // 一番内側のノードについて何かをする }); });});
3
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
ドキュメントの全節 ( ノード ) を渡り歩くのは大変
この例では、 11 回の繰り返し
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachChild(function(nodeName,childNode) { childNode.forEachChild(function(nodeName, childNode) { childNode.forEachChild(function(nodeName, childNode) { // 一番内側のノードについて何かをする }); });});
末端のノード ( 節 ) を渡り歩く?
• 末端のノード ( 節 ) とは、値を持っているが、その下に下位節がない DocumentNode です
2016/9/19 EWD 3 トレーニング・コース #24 4
5
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
6
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
7
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
8
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
9
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
この例を縦断するには、なんと 8 回の繰り返しが必要です
10
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
この例を縦断するには、なんと 8 回の繰り返しが必要です
DocumentNode には、別のメソッドがあります
forEachLeafNode()
11
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(value);});
12
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(value);});
123 foo foo2 bar1a bar2a bar1b bar2b bar3b
13
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(value);});
末端節 ( ノード ) の値
14
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(value);});
末端節 ( ノード ) の DocumentNode オブジェクト
15
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { // この節 ( ノード ) に対するプロパティや添え字の配列はどのように取得しますか?});
16
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(JSON.stringify(leafNode._node.subscripts));});
17
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(JSON.stringify(leafNode._node.subscripts));});
['a'] ['b', 'c1'] ['b', 'c2'] ['d', 'e1', 'f1a'] ['d', 'e1', 'f2a'] ['d', 'e2', 'f1b'] ['d', 'e2', 'f2b'] ['d', 'e2', 'f3b']
18
途中で中断するmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { if (leafNode._node.subscripts[0] === 'd') return true; console.log(value);});
途中で中止するには、コールバック関数から、 true を返します
19
末端のノードについて繰り返すmyDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #24
var doc = new this.documentStore.DocumentNode('myDoc');
doc.forEachLeafNode(function(value, leafNode) { console.log(value);});
とても大きく、入れ子の深さも深いドキュメント内のすべての節 ( ノード )をひとつずつ渡り歩く必要がある場合には、入れ子のループよりもはるかに速くできます