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

时间:2015-12-17 14:08:12

标签: javascript marklogic

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

我正在尝试查看用户是否在MarkLogic Security数据库中具有某个角色,因此我已经这样做了:

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保存为未签名的长这样:

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

现在indexOf()给了我-1又名not found

userRoleIdsArray.indexOf(3191093315651213021);

OR

userRoleIdsArray.indexOf("3191093315651213021");

给予:

-1

虽然

userRoleIdsArray[7]==3191093315651213021;

给予:

true

我在这里缺少什么?这不是使用indexOf()的方法吗?

更新&gt;&gt;&gt;下面的东西是在旁边的&#39;但结果却分散了上述核心问题的注意力。以下行为由@ DaveCassel的评论回答。

在创建的数组acceptedRoleIds

btw ,这更奇怪:

acceptedRoleIds.indexOf(spoId);

作品

acceptedRoleIds.indexOf(3191093315651213021);

没有?

this large number error in javascript可以相关吗?

2 个答案:

答案 0 :(得分:3)

您想要找到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

答案 1 :(得分:0)

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

您可以通过循环遍历来解决问题。请注意,我使用&#39; ==&#39;操作员而不是&#39; ===&#39 ;;需要进行类型转换。

// 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