ValueIterator.toArray().indexOf()返回意外结果

ValueIterator.toArray().indexOf() returns unexpected results?

本文关键字:意外 结果 返回 indexOf ValueIterator toArray      更新时间:2023-09-26

UPDATE:这不仅仅是关于javascript的问题,而是与MarkLogic平台上的javascript实现有关。正如这个问题的标题所指出的,它是关于xdmp.userRoles()函数返回的ValueIterator的特定行为

我正在尝试查看用户是否在MarkLogicSecurity数据库中扮演特定角色,因此我做了以下操作:

declareUpdate();
var pid = '7610802';
// TODO validate that user can do this
var spo  = 'scc-proj-' + pid + '-owner';
var spm  = 'scc-proj-' + pid + '-member';
var spam = 'scc-proj-' + pid + '-adv-member';
// we need the security db Ids of these roles
var spoId = xdmp.role(spo);
var spamId = xdmp.role(spam);
var acceptedRoleIds = [spamId,spoId];
// get roleIds from sec db for this user
var userRoleIds = xdmp.userRoles('scc-user-1');
// map ValueIterator to array
var userRoleIdsArray = userRoleIds.toArray(); 

现在userRoleIdsArray将id保存为未签名的长ID,如下所示:

[
"1088529792688125909", 
"1452323661308702627", 
"10258509559147330558", 
"10161853410412530308", 
"6677433310138437512", 
"12773061729023600875", 
"7482704131174481508", 
"3191093315651213021", <<<<< this is the one!!!
"5126952842460325403", 
"7089338530631756591", 
"15520654661378671735", 
"13041542794130379697"
]

现在indexOf()给了我-1,也就是not found

userRoleIdsArray.indexOf(3191093315651213021);

userRoleIdsArray.indexOf("3191093315651213021");

提供:

-1

userRoleIdsArray[7]==3191093315651213021;

提供:

true

我在这里错过了什么?这不是使用indexOf()的方法吗?

更新>>>下面的内容"站在一边",但结果分散了对上述核心问题的注意力。下面的行为得到了@DaveCassel的评论

btw在创建的数组acceptedRoleIds上,它更奇怪:

acceptedRoleIds.indexOf(spoId);

工作

acceptedRoleIds.indexOf(3191093315651213021);

不是吗?

javascript中的这个大量错误是否相关?

您要查找的是String,而不是数字。用途:userRoleIdsArray.indexOf("3191093315651213021");

这项工作:

var array = [
"1088529792688125909", 
"1452323661308702627", 
"10258509559147330558", 
"10161853410412530308", 
"6677433310138437512", 
"12773061729023600875", 
"7482704131174481508", 
"3191093315651213021",
"5126952842460325403", 
"7089338530631756591", 
"15520654661378671735", 
"13041542794130379697"
];
var n = array.indexOf("13041542794130379697");
document.write(n);

output: 11

不匹配的原因是ValueIterator.toArray()返回一个值数组(Value[])。当您调用.indexOf时,您传递的是字符串或unsignedLong,而不是值。由于类型不匹配,.indexOf()不会报告匹配。

您可以通过循环迭代来解决问题。请注意,我使用的是'==='运算符,而不是'===';需要类型转换。

// get roleIds from sec db for this user
var userRoleIds = xdmp.userRoles('my-user');
// map ValueIterator to array
var userRoleIdsArray = userRoleIds.toArray(); 
var target = 15520654661378671735;
var index = -1;
for (var i in userRoleIdsArray) {
  if (userRoleIdsArray[i] == target) {
    index = i;
  }
}
index