Выбор массива хэшей из хэша - PullRequest
3 голосов
/ 25 апреля 2011

У меня есть хэш, возвращаемый из источника данных XML, который выглядит следующим образом:

{...,
  'records' :{
    'record' :[
      {'availability' :{'$t' :'available'}, ...},
      {'availability' :{'$t' :'available'}, ...}
    ]
  }
};

Я хотел бы получить все хеши record в массив, чтобы я мог filter() сделать это и выполнить некоторые другие операции. Однако, когда у меня есть этот оператор в моем pre блоке,

raw_records = raw.pick("$..record");

возвращаемый массив является массивом из двух пустых строк:

var raw_records = ['', ''];

Странно то, что я могу выбрать только availability с ожидаемыми результатами:

availability = raw.pick("$..availability.$t");

производства

var availability = ['available', 'available'];

Что не так с моим первым pick()?

РЕДАКТИРОВАТЬ: Вот более полная версия, которая должна помочь с воспроизведением проблемы. Это немного отличается, так как я сейчас использую JSON-версию веб-сервиса:

global {
    datasource hbll <- "https://svc.lib.byu.edu/services/catalog/v1/search/?field=isbn&format=json&terms=";
}

rule new_rule {
    select when pageview "amazon.com/.*/?dp/(.*)/" setting (isbn)
    pre {
        //This is the array with two empty strings...
        raw = datasource:hbll(isbn);
        myfilter = function(x) { x.pick("availability") eq "available"; };
        records = raw.filter(myfilter);
        len = records.length();
        availability = records.pick("$..availability");
        middleman = len > 1 => availability[0] | availability;
        available = middleman eq "available" => true | false;
        url_list = records.pick("$..url");
        url = len > 1 => url_list[0] | url_list;
        msg = <<
            <p>This book is available for checkout at the BYU Library.</p>
            <a href="#{url}">More information</a>
        >>;
    }
    notify("BYU Harold B. Lee Library", msg) with sticky=true;
}

1 Ответ

1 голос
/ 26 апреля 2011

Мне понадобится более полный пример.Тестовое приложение и полученные результаты приведены ниже:

ruleset a8x167 {
    meta {
        name "Pick - Array of Hashes"
        description <<
            Testing
        >>
        author "Sam Curren"
        logging on
    }

    dispatch {}

    global {
        raw = {
          'records' :{
            'record' :[
              {'availability' :{'$t' :'available'}},
              {'availability' :{'$t' :'available'}}
            ]
          }
        };

    }

    rule test {
        select when pageview ".*" setting ()
        pre {
            raw_records = raw.pick("$..record");
            availability = raw.pick("$..availability.$t");
        }
        notify("Hello World", "This is a sample rule.");
    }
}

И результаты:

var raw_records = [{'availability' :{'$t' :'available'}}, {'availability' :{'$t' :'available'}}];
var availability = ['available', 'available'];
...