#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть инструкция if:
if(firstString == "no" amp;amp; secondString == "no" amp;amp; thirdString == "no"){
// Do stuff here
}
Есть ли более приятный способ форматирования этого? Использовать false
вместо "no"
не вариант, поскольку данные, которые я проверяю, взяты из запроса AJAX, и я не контролирую его вывод. В противном случае я бы написал это так:
if(!firstString amp;amp; !secondString amp;amp; !thirdString){
// Do stuff here
}
Спасибо
Обновить:
Я знаю, что это совершенно нелепо, но мне пришло в голову, что это действительно может быть кратчайший путь:
if(firstString secondString thirdString == "nonono"){
// Do stuff here
}
Комментарии:
1. Известно ли количество строк заранее, или это похоже на массив, который может содержать любое количество строк?
2. Краткий ответ: нет, нет отличного способа упростить это.
3. Спасибо за помощь. Очевидно, что это не имеет большого значения, но мне всегда нравится пытаться найти способы сделать вещи немного проще / приятнее, если я могу.
4. @kennis: Вы видите, что ваш кратчайший способ также приемлем
"non" "" "ono"
, верно?5. @maaartinus Известно, что значения всегда либо «да», либо «нет», так что на самом деле это не имеет значения.
Ответ №1:
Учитывая, что количество строк известно заранее, то у вас есть 2 варианта, насколько я могу видеть..
-
Оставьте все как есть. Оператор if не сложен для чтения, и любые альтернативные форматы будут либо такими же сложными, либо еще более запутанными.
-
преобразуйте строки в логические значения при получении данных из запроса AJAX, чтобы вместо «да» и «нет» сохранялось значение TRUE или FALSE. Это позволило бы вам использовать предпочитаемый вами формат инструкции if и могло бы быть более эффективным, чем многие сравнения строк, если вы выполняете их много.
В конце концов, что вы делаете, зависит от вас, но лично я думаю, что было бы лучше просто придерживаться того, что у вас есть. Не беспокойтесь о форматировании инструкции if, довольно очевидно, что она делает, и, на мой взгляд, ее не нужно менять.
Ответ №2:
If( «no» == FirstString amp;amp; FirstString == secondString amp;amp; secondString == thirdString )
Ответ №3:
Было немного сложно точно определить, что вы оцениваете как true или false, но это можно немного изменить, чтобы получить то, что вы ищете.
var checkStrings = function() {
var no = "no",
args = Array.prototype.slice.call(arguments);
for (var i = 0, len = args.length; i < len; i ) {
if (args[i] !== no) {
return false;
}
}
return true;
};
if (checkStrings(firstString, secondString, thirdString)) {
// Do stuff here
}
Ответ №4:
Извините, не подумал — это если бы вы проверяли, были ли КАКИЕ-либо «нет»
if ($.inArray('no', [firstString, secondString, thirdString]) >= 0) {
// Do something if the value is 'no'
}
ОБНОВЛЕННЫЙ ОТВЕТ
К сожалению, в jQuery нет функции reduce() (еще один дополнительный массив, представленный в JS 1.6, но недоступный в старых браузерах), которая бы отлично справилась с задачей.
Вот один из способов проверить, все ли значения «нет»:
var found = true;
$.each([firstString, secondString, thirdString], function (i, str) {
if (str !== 'no') {
found = false;
}
});
Это может показаться уродливым, но оно должно быть короче, если у вас есть намного больше строк для проверки.
Если вы хотите, чтобы это было обернуто в функцию, вы могли бы сделать:
function allTrue (arr, checkStr) {
var found = true;
$.each(arr, function (i, str) {
if (str !== checkStr) {
found = false;
}
});
return found;
}
if (allTrue([firstString, secondString, thirdString], 'no')) {
// ...
}
Комментарии:
1. Эквивалентный ответ уже был опубликован и удален. Это не делает то же самое, что исходный код.
2. Это вернет значение true, если какая-либо из переменных равна «no». Он хочет, чтобы все 3 были.
Ответ №5:
function F(var value){
return value === "no";
}
if(F(firstString) amp;amp; F(secondString) amp;amp; F(thirdString)){
// Do stuff here
}
Комментарии:
1. Почему вы отрицаете равенство в функции и снова отрицаете прямо за пределами функции?
2. просто потому, что это кажется мне более интуитивно понятным, чем наличие функции типа
IsFalse(value)
3. будет ли это накладными расходами, поскольку вместо трех сравнений будут вызваны три функции?
4. функции по сути являются просто сравнением, поэтому «дополнительными накладными расходами», которые это может привести, можно пренебречь
Ответ №6:
Другой вариант, с использованием jQuery.unique:
var uniques = $.unique([firstString, secondString, thirdString]);
if (uniques.length === 1 amp;amp; uniques[0] === "no") {
// do stuff
}