2015-09-02 3 views
2

Я пытаюсь работать с массивами. Это какой-то рабочий код, который объясняет, что я делаю.MarkLogic 8 JavaScript Массивы

// query 

var a = ["1000", "2000", "3000"]; 
var b = ["2000"];  

for (i in b) { 
    var index = a.indexOf(b[i]); 
}; 

if (index > -1) { 
    a.splice(index, 1); 
}; 

a 

Теперь, когда я использую эту же логику для результатов моего запроса, она больше не работает.

// query 

queryDo = cts.andQuery([ 
     cts.jsonPropertyValueQuery("displayable", "true"), 
     cts.jsonPropertyValueQuery("section", "dikw Track Events"), 
     cts.jsonPropertyValueQuery("name", 'dikw_default'), 
     cts.collectionQuery(["reference/application"]) 
    ]); 

queryDont = cts.andQuery([ 
     cts.jsonPropertyValueQuery("displayable", "false"), 
     cts.jsonPropertyValueQuery("section", "dikw Track Events"), 
     cts.jsonPropertyValueQuery("name", 'Helpdesk'), 
     cts.collectionQuery(["reference/application"]) 
    ]); 

var qDo = cts.jsonPropertyWords("code", null, "document", queryDo).toArray(); 
var qDont = cts.jsonPropertyWords("code", null, "document", queryDont).toArray(); 

for (i in qDont) { 
    var index = qDo.indexOf(qDont[i]); 
}; 

if (index > -1) { 
    qDo.splice(index, 1); 
}; 

qDo 

Я проверил, что результатом обоих запросов является массив. Массивы состоят из значений, подобных примерному коду; 1000, 2000 и т. Д. Кроме того, когда я использую notAndQuery для исключения результатов из второго запроса из первого, это не влияет.

Например, когда я смотрю на qDo [2], возвращается правильное значение.

Мои andNotQuery:

queryDo = cts.andQuery([ 
     cts.jsonPropertyValueQuery("displayable", "true"), 
     cts.jsonPropertyValueQuery("section", "dikw Track Events"), 
     cts.jsonPropertyValueQuery("name", 'dikw_default'), 
     cts.collectionQuery(["reference/application"]) 
    ]); 

queryDont = cts.andQuery([ 
     cts.jsonPropertyValueQuery("displayable", "false"), 
     cts.jsonPropertyValueQuery("section", "dikw Track Events"), 
     cts.jsonPropertyValueQuery("name", 'Helpdesk'), 
     cts.collectionQuery(["reference/application"]) 
    ]); 

andnot = cts.andNotQuery(queryDo, queryDont); 

result = cts.jsonPropertyWords("code", null, "document", andnot); 

ответ

0

После подачи ошибки в MarkLogic я получил эту repsonse от инженерной команды:

«Возвращение из вызова лексикона является StringWithFrequency (а не только String) поэтому слой JS оборачивает его»

вы можете создать массив из вызова cts.jsonPropertyWords, как вы делали раньше, но вы должны будете перебирать и получить строковые значения для еа ch item в свою очередь сначала.Что-то вроде этого:

  1. Создания массива из cts.jsonPropertyWords, как и прежде
  2. Создать новый массив
  3. перебирать исходный массив и нажмите строковое значение каждого из элементов вступили в новую Array. Вызов indexOf будет работать над новым массивом.

Работа вокруг

var trackCodes = cts.jsonPropertyWords("code", null, "document", cts.andQuery([])).toArray(); 
var tc2 = new Array(); 

for (var i = 0; i < trackCodes.length; i++){ 
    tc2.push(trackCodes[i].toString()) 
} 

tc2.indexOf(["your value"]) 
2

Я думаю, что есть ошибка в вашей логике. Если в конце кажется неуместным. Если продлить ваш пример с номером, чтобы включить другое значение, оно идет не так:

var a = ["1000", "2000", "3000", "4000"]; 
var b = ["2000", "3000"];  

for (i in b) { 
    var index = a.indexOf(b[i]); 
}; 

if (index > -1) { 
    a.splice(index, 1); 
}; 

a 

Вместо этого, если должно быть в пределах для цикла:

var a = ["1000", "2000", "3000", "4000"]; 
var b = ["2000", "3000"];  

for (i in b) { 
    var index = a.indexOf(b[i]); 

    if (index > -1) { 
     a.splice(index, 1); 
    }; 
}; 

a 

Но это может быть целесообразно исследовать с помощью notQuery в некотором роде. В зависимости от расположения ваших данных это может сработать. Это было бы гораздо более эффективным, так как вам не пришлось бы выполнять выборочную фильтрацию после поиска.

HTH!

+0

Я изменить свой код, чтобы отразить изменения для петли на массив б. Также включен мой andNotQuery. – Thijs

+0

Я думаю, что ваш запрос andNot должен быть более избирательным. У вас есть запрос коллекции как в queryDo, так и в queryDont. Таким образом, с помощью andNotQuery вы получаете 'сбор ref/app, а не сбор ref/app' .. :) – grtjn

+0

разница в этой строке: cts.jsonPropertyValueQuery (« name »,« Helpdesk ») Я протестировал запросы en 1 возвращает 1000, 2000, 3000, а другая возвращает 2000. Результат с использованием andNot по-прежнему остается всей первой последовательностью. – Thijs

3

для/в операторе не может быть итерация массива в пути вы ожидаете:

«Там нет никакой гарантии, что ... в возвратят индексы в определенном порядке, и он будет возвращать все перечислимые свойства, в том числе с нецелыми именами и теми, которые наследуются ».

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

Кроме того, для/в может препятствовать оптимизации в v8:

https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#5-for-in

Если вы используете знакомое for (var i=0; i < array.length; i++) {...} заявление, что делает ожидаемые результаты?

Надеясь, что помогает,

+0

Я также столкнулся с этой проблемой, и для меня работал классический цикл. – wudzik