首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MarkLogic 8 JavaScript阵列

MarkLogic 8 JavaScript阵列
EN

Stack Overflow用户
提问于 2015-09-02 06:33:13
回答 3查看 168关注 0票数 2

我正试着处理数组。这是一些工作代码,解释了我在做什么。

代码语言: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

现在,当我对我的查询结果使用相同的逻辑时,它不再工作了。

代码语言:javascript
复制
// 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:

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-18 08:26:40

在MarkLogic提交了一个bug之后,我从工程团队那里得到了这个回复:

“从词汇表调用返回的是一个StringWithFrequency (不仅仅是一个字符串),因此JS层封装它”

您可以像前面一样,从对cts.jsonPropertyWords的调用中创建一个数组,但是您需要迭代,然后依次获得每个项的字符串值。就像这样:

  1. 像前面一样从cts.jsonPropertyWords创建数组
  2. 创建一个新的数组
  3. 迭代原始数组,并将每个项的字符串值推入新的Array中。对indexOf的调用将在新的数组上工作。

围绕着工作

代码语言:javascript
复制
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"])
票数 0
EN

Stack Overflow用户

发布于 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++) {...}语句,这会产生预期的结果吗?

希望这有帮助,

票数 3
EN

Stack Overflow用户

发布于 2015-09-02 07:05:04

我认为你的逻辑上有一个缺陷。如果在最后似乎是错误的。如果用数字扩展示例以包含另一个值,则会出错:

代码语言:javascript
复制
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循环中:

代码语言:javascript
复制
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可能是值得的。这取决于数据的布局,可以工作。这也会更有效,因为在搜索之后,您不必进行自定义过滤。

哈哈!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32346089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档