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 } }); 

其他事情

这里有一些我认为值得一提的无关的东西

  • 你可能会删除这一行,因为variablesSetList没有被使用。

    var SetList = require('fs');

  • 您不需要将setList初始化为fs模块的实例。 由于您稍后将重新定义它,因此您可以声明该variables而不实例化它。 更好的是,你可以在callback中定义它,因为它是唯一被使用的地方。

  • 如果您对以'/'开头的string调用fs.createReadStreamfs.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)); } });