繁体   English   中英

Oboe.js-如何使用可链接方法和检索祖先值

[英]Oboe.js - how to work with chainable method and retrieving ancestor value

我正在使用oboe.js,并且我想从节点“ sections”中检索数据,还将祖先profile_namespace和owner_name映射到从sections节点检索的数据(请参阅下面的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"
      }]
    }
  }]
}

现在,我只能从节点“ sections”中检索数据,但是我在文档中看到.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));
        }
    });

谢谢你的帮助!

多米尼克

让我知道我是否误解了您的部分问题,并更新了答案。

在双簧管中使用祖先

传递给节点侦听器的回调函数将使用三个参数触发。 第一个是树中已匹配的节点,第二个将是表示该节点的路径的数组,第三个将是表示该节点的祖先的对象的数组。 在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

    }
});

其他事情

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

  • 您可能可以删除此行,因为未使用变量SetList

    var SetList = require('fs');

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

  • 如果对以'/'开头的字符串调用fs.createReadStreamfs.createWriteStream ,则节点(至少v0.10.41)会引发错误。 我建议用'./myjson.json''showInfo.json'称呼他们

  • 我建议使用在Oboe中注册节点侦听器的简便方法。 这只是一种风格上的偏爱。 如果要注册多个侦听器,则另一种语法可能会很有用,但是我认为链接在这种情况下同样有用。

我建议的您发布的代码的实现

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

    }
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM