ValueIterator.toArray().indexOf()返回意外结果
ValueIterator.toArray().indexOf() returns unexpected results?
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
相关文章:
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- Javascript:函数返回意外结果
- 意外结果,在 ASP.Net 中解析 JSON 对象的数组
- 按位或意外结果
- 来自 JavaScript 循环的意外结果
- 从 JavaScript 中的图像中读取像素数据会返回半透明像素的意外结果
- 在 JS 中短路空数组会产生意外结果:“[] ||真 == []'
- NodeJS中的Parse Json文件在Node中显示意外结果
- 基于给出意外结果的提示输入的逻辑
- JavaScript Regexp.test返回意外结果
- 键控产生意外结果.HTML5游戏
- Javascript do/while循环显示意外结果
- 来自 CSS 和 jQuery 的意外结果
- MongoDB mapReduce方法意外结果
- 具有意外结果的 Javascript 函数参数
- 在 JavaScript 中解析日期字符串的意外结果
- 从内部HTML更改为表单时获得意外结果,输入类型文本字段
- 在计算链逻辑表达式 JavaScript 时出现意外结果
- 意外结果 - 谷歌自动完成针对约克郡
- JavaScript unshift 参数返回意外结果