MarkLogic 8 JavaScript 个数组
MarkLogic 8 JavaScript Arrays
我正在尝试使用数组。这是一些解释我在做什么的工作代码。
// 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);
我觉得你的逻辑有问题。最后的 if 似乎放错了地方。如果您使用数字扩展您的示例以包含另一个值,则会出错:
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
相反,if 应该在 for 循环中:
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!
for/in 运算符可能没有按照您期望的方式遍历数组:
"There is no guarantee that for...in will return the indexes in any particular order and it will return all enumerable properties, including those with non–integer names and those that are inherited."
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
此外,for/in 可能会抑制 v8 中的优化:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#5-for-in
如果您使用熟悉的 for (var i=0; i < array.length; i++) {...}
语句,是否会产生预期的结果?
希望对您有所帮助,
在 MarkLogic 提交错误后,我收到了工程团队的回复:
"The return from the lexicon call is a StringWithFrequency
(not just a
String) so the JS layer wraps it"
您可以像以前一样从对 cts.jsonPropertyWords
的调用中创建一个数组,但您需要先遍历并依次获取每个项目的字符串值。像这样:
- 像以前一样从
cts.jsonPropertyWords
创建数组
- 新建数组
- 遍历原始数组并将每个项目的字符串值推入新数组。对
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"])
我正在尝试使用数组。这是一些解释我在做什么的工作代码。
// 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);
我觉得你的逻辑有问题。最后的 if 似乎放错了地方。如果您使用数字扩展您的示例以包含另一个值,则会出错:
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
相反,if 应该在 for 循环中:
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!
for/in 运算符可能没有按照您期望的方式遍历数组:
"There is no guarantee that for...in will return the indexes in any particular order and it will return all enumerable properties, including those with non–integer names and those that are inherited."
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
此外,for/in 可能会抑制 v8 中的优化:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#5-for-in
如果您使用熟悉的 for (var i=0; i < array.length; i++) {...}
语句,是否会产生预期的结果?
希望对您有所帮助,
在 MarkLogic 提交错误后,我收到了工程团队的回复:
"The return from the lexicon call is a
StringWithFrequency
(not just a String) so the JS layer wraps it"
您可以像以前一样从对 cts.jsonPropertyWords
的调用中创建一个数组,但您需要先遍历并依次获取每个项目的字符串值。像这样:
- 像以前一样从
cts.jsonPropertyWords
创建数组 - 新建数组
- 遍历原始数组并将每个项目的字符串值推入新数组。对
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"])