Oboe.js – 如何使用可链式方法和检索祖先值
我正在使用oboe.js和我想从节点“节”中检索数据,还将祖先profile_namespace和owner_name映射到节节点的数据检索(请参阅下面的json文件提取)。
JSON文件提取(myjson.json):
{ "data": [{ "profile_namespace": "DS", "tutorial": { "owner_name": "Dominic", "picture_url": "/picture.jpg", "title": "The code", "url": "/Dominic/thecode/", "sections": [{ "episode_url": "/tutorial/intro/symphony-of-war/", "artist": "MasterOrchestra", "title": "Symphony of War" }, { "episode_url": "/tutorial/mainshow/musicproductiontip1/", "artist": "DStone", "title": "Music production tip 1" }, { "episode_url": "/tutorial/outrothe/nextshow/", "artist": "MasterOrchestra", "title": "Next show" }] } }] }
现在我只能从节点“节”中检索数据,但是我在文档中看到.node返回可链接的方法,并且可以使用“祖先”的概念从父节点检索数据。
有没有人可以解释我如何使用这种方法(见我的代码如下)?
码
var oboe = require('oboe'); var fs = require('fs'); var SetList = require('fs'); var setList = []; var showInfo = require('fs'); oboe(fs.createReadStream('/myjson.json')) .node({ 'sections': function(node) { setList.push(node); showInfo = fs.createWriteStream('/showInfo.json'); showInfo.write(JSON.stringify(setList)); } });
谢谢你的帮助!
多米尼克
让我知道如果我误解了你的问题的一部分,我更新我的答案。
在双簧pipe使用祖先
传递给节点侦听器的callback函数将使用三个参数触发。 第一个是已经匹配的树中的节点,第二个是表示该节点path的数组,第三个是表示该节点祖先的对象数组。 这被logging在API的节点事件部分的末尾附近。
.node({ 'sections': function(sections, path, ancestors) { var grandparent = ancestors[ancestors.length - 2]; console.log(grandparent.owner_name); // Dominic var greatGrandparent = ancestors[ancestors.length - 3]; console.log(greatGrandparent.profile_namespace); // DS } });
其他事情
这里有一些我认为值得一提的无关的东西
-
你可能会删除这一行,因为variables
SetList
没有被使用。var SetList = require('fs');
-
您不需要将
setList
初始化为fs
模块的实例。 由于您稍后将重新定义它,因此您可以声明该variables而不实例化它。 更好的是,你可以在callback中定义它,因为它是唯一被使用的地方。 -
如果您对以
'/'
开头的string调用fs.createReadStream
或fs.createWriteStream
,节点(至lessv0.10.41)会引发错误。 我会build议用'./myjson.json'
和'showInfo.json'
-
我会build议使用在双簧pipe注册一个节点监听器的速记方式。 这一个只是一个风格偏好。 如果你注册了多个监听器,另一个语法可能很有用,但是我认为链接在这种情况下是一样的。
我build议实施你发布的代码
var oboe = require('oboe'); var fs = require('fs'); oboe(fs.createReadStream('./myjson.json')) .node('sections', function(sections, path, ancestors) { var mutatedSections = sections; // change mutatedSections however you want var showInfo = fs.createWriteStream('./showInfo.json'); showInfo.write(JSON.stringify(mutatedSections)); } });