Oboe.js - как работать с цепным методом и получать значение предка

Я использую oboe.js и хочу извлечь данные из "разделов" узла, а также сопоставить предок 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));
        }
    });

Спасибо за вашу помощь!

Dominic

1 ответ

Решение

Дайте мне знать, если я неправильно понял части вашего вопроса, и я обновлю свой ответ.

Использование предков в гобой

Функция обратного вызова, которую вы передаете слушателю узла, сработает с тремя аргументами. Первый - это узел в дереве, который был сопоставлен, второй - массив, представляющий путь к этому узлу, а третий - массив объектов, представляющих предков этого узла. Это задокументировано ближе к концу раздела событий узла 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 модуль. Поскольку вы собираетесь переопределить его позже, вы можете просто объявить эту переменную без ее создания. Более того, вы можете определить его в обратном вызове, так как это единственное место, где он используется.

  • Узел (по крайней мере v0.10.41) выдает ошибку, если вы звоните fs.createReadStream или же fs.createWriteStream на строке, начинающейся с '/', Я бы предложил позвонить им с './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));

    }
  });
Другие вопросы по тегам