我正试着处理数组。这是一些工作代码,解释了我在做什么。
// 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从第一个查询中排除第二个查询的结果时,这没有任何效果。
例如,当我查看qDo2时,将返回正确的值。
My 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);发布于 2016-03-18 08:26:40
在MarkLogic提交了一个bug之后,我从工程团队那里得到了这个回复:
“从词汇表调用返回的是一个
StringWithFrequency(不仅仅是一个字符串),因此JS层封装它”
您可以像前面一样,从对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"])发布于 2015-09-03 14:40:20
for/in运算符可能不会以您预期的方式迭代数组:
“不能保证for...in将以任何特定的顺序返回索引,它将返回所有可枚举属性,包括具有非整数名的属性和继承的属性。”
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++) {...}语句,这会产生预期的结果吗?
希望这有帮助,
发布于 2015-09-02 07:05:04
我认为你的逻辑上有一个缺陷。如果在最后似乎是错误的。如果用数字扩展示例以包含另一个值,则会出错:
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可能是值得的。这取决于数据的布局,可以工作。这也会更有效,因为在搜索之后,您不必进行自定义过滤。
哈哈!
https://stackoverflow.com/questions/32346089
复制相似问题