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

EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く