更新:这不仅仅是关于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);
没有?
答案 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