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

Javascript Oboe.js-如何使用可链接方法和检索祖先值,javascript,node.js,oboe.js,Javascript,Node.js,Oboe.js,我正在使用oboe.js,我希望从节点“sections”检索数据,并将祖先配置文件名称空间和所有者名称映射到从sections检索的数据节点(请参见下面的json文件摘录) JSON文件提取(myjson.JSON): { "data": [{ "profile_namespace": "DS", "tutorial": { "owner_name": "Dominic", "picture_url": "/picture.jpg", "

我正在使用oboe.js,我希望从节点“sections”检索数据,并将祖先配置文件名称空间和所有者名称映射到从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返回chainable方法,并且可以使用“祖先”的概念从父节点检索数据

有人能告诉我如何使用这个方法吗(见下面我的代码)

代码

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({
“节”:函数(节、路径、祖先){
var祖父母=祖先[祖先.长度-2];
console.log(祖父母.owner_name);//多米尼克
var great祖父母=祖先[祖先.length-3];
console.log(greatGrandparent.profile_命名空间);//DS
}
});
其他事情 以下是一些我认为值得一提的不相关的事情

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

    var SetList=require('fs')

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

  • 如果对以
    “/”开头的字符串调用
    fs.createReadStream
    fs.createWriteStream
    ,则节点(至少v0.10.41)将抛出错误。我建议用
    './myjson.json'
    'showInfo.json'

  • 我建议使用在双簧管中注册节点侦听器的速记方式。这只是一种风格偏好。如果要注册多个侦听器,其他语法可能会很有用,但我认为链接在这种情况下也同样有用

我建议实现您发布的代码
var-oboe=require('oboe');
var fs=需要('fs');
双簧管(fs.createReadStream('./myjson.json'))
.node(“节”,函数(节,路径,祖先){
var mutatedSections=截面;
//根据您的需要更改mutatedSections
var showInfo=fs.createWriteStream('./showInfo.json');
write(JSON.stringify(mutatedSections));
}
});

谢谢您的解释。我现在了解了如何管理祖先节点和转换数据,以获得所需的结构:O) 太棒了,很高兴我能帮忙!你能接受这个答案吗?现在我得到一个无效的JSON文件。问题在于,每个mutatedSection都作为一个有效的JSON进行注释合并。在每个mutatedSections节点之后,我得到的是“][”而不是“,”。你知道如何在最后获得无效的json文件吗?现在,我需要用逗号替换所有“][”。谢谢!我刚刚注意到我的json示例应该有多个“sections”节点。