Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从用冒号分隔的一系列角色中获取数据?_Javascript - Fatal编程技术网

Javascript 如何从用冒号分隔的一系列角色中获取数据?

Javascript 如何从用冒号分隔的一系列角色中获取数据?,javascript,Javascript,我有一个java字符串,其中的用户角色信息用冒号分隔。变量a可能包含如下数据: var a = "Admin:xxxx:Data"; var a = "xxxx"; var a = "Test"; var a = "Admin" 我需要根据这个公式设置另一个变量,这取决于测试、xxx和数据角色是否存在。注:我已经进行了检查,以确保Test和xxxx不能同时存在,并且必须至少有一个存在 index = 0 if the 'Test' role appears index = 1 if t

我有一个java字符串,其中的用户角色信息用冒号分隔。变量
a
可能包含如下数据:

var a = "Admin:xxxx:Data";
var a = "xxxx";
var a = "Test";
var a = "Admin"
我需要根据这个公式设置另一个变量,这取决于测试、xxx和数据角色是否存在。注:我已经进行了检查,以确保Test和xxxx不能同时存在,并且必须至少有一个存在

index = 0   if the 'Test' role appears
index = 1   if the 'xxxx' role appears
index = 100 if the 'Test' and 'Data' role appear
index = 101 if the 'xxxx' and 'Data' roles appear
再加上另外四个变量:

isXxxx = true if xxxx appears
isData = true if Data appears
isTest = true if Test appears
isAdmin = true if Admin appears
有没有一个简单的方法,我可以编码这个。例如,现在我不确定该怎么做
从变量a中取出各个角色,这样即使有人可以建议我,这可能足以让我继续。

基于您使用
var
初始化变量的事实,我假设您使用的是JavaScript而不是Java代码。除此之外,您还可以这样做:

var a = "Admin:xxxx:Data";
var parts = a.split(':');
for(part in parts) {
    console.log(parts[part]);
}
此代码将
上的字符串拆分,并在各个部分上循环


另外,我想指出,您定义了
var a
3次,这是没有必要的。此外,每次赋值都会覆盖
a
的现有值。

如果您只对“If'xyz'role exists”感兴趣,则可以使用string indexOf()函数并检查返回值。例如:

var isAdmin = (a.indexOf("Admin")!=-1);
然后根据“是”变量,您可以轻松形成规则:

var index=-1;
if (isAdmin && isXxxx) index=666;

最后,我认为你应该优先考虑你的规则。例如,如果角色中存在所有“xxxx”、“Test”和“Data”(问题的最后两条规则相互冲突),该怎么办。然而,我没有将其存储在以10为基数的整数(如1、10、100等)中,而是使用位整数(以2为基数)进行存储

下面是一个表格,其中列出了可以由此形成的各种角色的示例:

 Bits | Data | Role
--------------------
 0000 |  0   | Empty
 0001 |  1   |   1
 0010 |  2   |   2
 0011 |  3   |  1,2
 0100 |  4   |   3
 0111 |  7   | 1,2,3
 1001 |  9   |  1,4
并检查它们是否匹配:

function hasAllBits(x, y) {
    for (; y > 0; x >>= 1, y >>= 1) // Goes until reached every bit in y
        if (y % 2 > x % 2) // modulus 2 takes last bit (even or odd)
            return false; // Only possible if y == 1 and x == 0 (y>x)
    return true; // It depleted y; x had each bit
}
console.log(hasAllBits(7, 1)); // Check if user with 0111 has role 0001, true
console.log(hasAllBits(4, 1)); // Check if user with 0100 has role 0001, false
console.log(hasAllBits(1, 7)); // Check if user with 0001 has role 0111, false
至于获取每个位的标题,您希望它返回一个数组(因为它可以返回多个角色),因此可以这样做:

function getRoles(r){
  var ans=[],roles=['1st','2nd','3rd','Supreme'];
  r = r.toString(2).split('').reverse();
  for(var i in r) {
    if(r[i] == '1') {
      if(roles.length > i)
        ans.push(roles[i]);
      else
        ans.push('Unknown');
    }
  }
  return ans;

console.log(getRoles(0)); // []
console.log(getRoles(4)); // ["3rd"]
console.log(getRoles(9)); // ["1st", "Supreme"]
console.log(getRoles(63)); // ["1st", "2nd", "3rd", "Supreme","Unknown","Unknown"]

这是Java还是JavaScript?这是两种不同的语言。你可以告诉你怎么做,也可以告诉你怎么研究。。。。后者更好。从研究javascript字符串方法开始,可能会很快遇到
split()
ps:温柔一点,第一个答案:)这是一个很好的解决方案!这比在分割的阵列部件上循环要简单得多!