【问题标题】:Oboe.js - how to work with chainable method and retrieving ancestor valueOboe.js - 如何使用可链接的方法和检索祖先值
【发布时间】:2016-02-16 14:46:29
【问题描述】:

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

感谢您的帮助!

多米尼克

【问题讨论】:

    标签: javascript node.js oboe.js


    【解决方案1】:

    如果我误解了您的部分问题,请告诉我,我会更新我的答案。

    在双簧管中使用祖先

    您传递给节点侦听器的回调函数将使用三个参数触发。第一个是树中匹配的节点,第二个是表示该节点路径的数组,第三个是表示该节点祖先的对象数组。这记录在 API 的 node-event section 末尾附近。

    .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.createReadStream 或fs.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));
    
        }
      });
    

    【讨论】:

    • 感谢您的所有解释。我现在了解如何管理祖先节点并转换我的数据以获得我需要的结构。 :O)
    • 太棒了,很高兴我能帮上忙!你能接受这个答案吗?
    • 现在我得到一个无效的 JSON 文件。问题是每个 mutatedsections 都作为一个有效的 JSON 合并注释。在每个 mutatedSections 节点之后,我得到“] [”而不是“,”。你知道如何管理最后获取那个无效的 json 文件吗?现在,我需要用逗号替换所有“][”。谢谢!
    • 我刚刚注意到我的 JSON 示例应该有多个“部分”节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2012-05-09
    • 2013-05-08
    • 2013-02-06
    相关资源
    最近更新 更多