#javascript
#javascript
Вопрос:
У меня есть строка Java с информацией о роли пользователя, разделенной двоеточиями. Переменная a
может содержать такие данные:
var a = "Admin:xxxx:Data";
var a = "xxxx";
var a = "Test";
var a = "Admin"
Мне нужно установить другую переменную на основе этой формулы, которая зависит только от того, присутствуют или нет роли Test, xxx и Data. Обратите внимание, что у меня уже есть проверка, чтобы убедиться, что 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, поэтому, даже если бы кто-нибудь мог посоветовать мне только это, вероятно, было бы достаточно, чтобы я начал.
Комментарии:
1. Это Java или JavaScript? Это два разных языка.
2. могу рассказать вам, как это сделать, или рассказать, как это исследовать …. последнее лучше. Начните с изучения строковых методов javascript, которые, вероятно, встречаются
split()
довольно быстро
Ответ №1:
Если вас интересует только «если существует роль ‘xyz'», вы можете использовать функцию string indexOf (w3schools) и проверить возвращаемое значение. Пример:
var isAdmin = (a.indexOf("Admin")!=-1);
Затем на основе ваших переменных «is» вы можете легко сформировать свои правила:
var index=-1;
if (isAdmin amp;amp; isXxxx) index=666;
Наконец, я думаю, вам следует расставить приоритеты в своих правилах. Например, что, если все «xxxx», «Test» и «Data» существуют в ролях (последние 2 правила вопроса конфликтуют друг с другом).
Комментарии:
1. PS: Будьте осторожны, первый ответ 🙂
2. Это отличное решение! Это намного проще, чем перебирать части разделенного массива!
Ответ №2:
Исходя из того факта, что вы использовали var
для инициализации переменных, я предполагаю, что у вас есть JavaScript, а не Java-код. Помимо этого, вы могли бы сделать это:
var a = "Admin:xxxx:Data";
var parts = a.split(':');
for(part in parts) {
console.log(parts[part]);
}
Этот код разбивает строку :
и перебирает части.
Кроме того, я хотел бы отметить, что вы определяете var a
3 раза, и в этом нет необходимости. Кроме того, вы перезаписываете существующее значение a
при каждом назначении.
Ответ №3:
Недавно я сделал что-то подобное. Однако вместо того, чтобы хранить их в целых числах с базовым значением 10 (например, 1, 10, 100 и т. Д.), Я сделал это с побитовыми целыми числами (base-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"]