MarkLogic - Как эффективно фильтровать последовательность с помощью JavaScript - PullRequest
1 голос
/ 14 мая 2019

Мне нужно отфильтровать последовательность MarkLogic (после запроса cts) с помощью javascript, проверив наличие элемента. Если элемент существует, покажите значение. Я знаю, что это возможно с XQuery, делая что-то вроде

fn:filter(function($a) { fn:not(fn:empty($a/es:envelope/es:instance/MyEntity/MyField)) }, $miseq)/es:envelope/es:instance/MyEntity/MyField

Я не видел эквивалента для Javascript. Я знаю, что могу сделать это вручную, используя цикл for, но производительность значительно хуже (не говоря уже о том, что она менее привлекательна)

Любое предложение / с?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 мая 2019

A Sequence является экземпляром Iterable, как описано в справочном руководстве JavaScript .Таким образом, вы можете просто повторить его, как другие итерации в JavaScript.Что-то вроде:

var result = [];

for (const a of miseq) {
   var myField = a.xpath('/es:envelope/es:instance/MyEntity/MyField');

   if (fn.exists(myField)) {
     result = result.concat(myField.toArray()); // you may be pulling more than one element
   }
}

HTH!

0 голосов
/ 14 мая 2019

Вы знаете, как это сделать из XQuery. Вы можете вызвать xquery из JavaScript. Если для этого есть достаточно веские основания (например, производительность), я советую вам попробовать то, что вы знаете. В Javascript нет концепции основного языка последовательностей, которую использует XQuery, поэтому то, что можно сделать в XQuery в качестве «основных» операторов языка, не всегда может быть выполнено и в JavaScript (и наоборот). Поддержка JavaScript не подразумевает, что не бывает случаев, когда XQuery может быть лучшим вариантом (или наоборот). Поддержка вызова XQuery из JavaScript подразумевает, что этот вариант использования считается разумным (и наоборот). Полиглот не ругатель.

...