有没有更好的方法来改进下面的语句,以检查val()
是否为'true'
或'false'
,如果是,则将其更改为布尔值。原因是,一些值可能是单词。
var thisval = $(this).val();
if (thisval == "true"){
ao[id] = true;
} else if (thisval == "false"){
ao[id] = false;
} else {
ao[id] = $(this).val();
}
有没有更好的方法来改进下面的语句,以检查val()
是否为'true'
或'false'
,如果是,则将其更改为布尔值。原因是,一些值可能是单词。
var thisval = $(this).val();
if (thisval == "true"){
ao[id] = true;
} else if (thisval == "false"){
ao[id] = false;
} else {
ao[id] = $(this).val();
}
最易读的:
var thisval = $(this).val();
ao[id] = thisval === 'true' ? true :
thisval === 'false' ? false :
thisval;
根据条件运算符编写的一行代码:var thisval = $(this).val();
ao[id] = thisval === 'true' ? true : (thisval === 'false' ? false : thisval);
基于 || 和 && 行为的一行代码:
var thisval = $(this).val();
ao[id] = thisval === 'true' || (thisval !== 'false') && thisval || false;
最短的一行代码(以上方法的组合):
var thisval = $(this).val();
ao[id] = thisval === 'true' || (thisval === 'false' ? false : thisval);
thisval
是否是字符串,最后如果它不等于 true
或者 false
,我们仍然可以假定 thisval
可能已经是一个 布尔值,如果不是的话,它也无法通过进一步的测试。 - svassr请尝试使用JSON.parse()。
"true"
和"false"
实际上是true
和false
的json表示方式。这就是ajax将从服务器端作为字符串解析的json对象。如果在服务器端返回true,false =>浏览器将其作为字符串"true"或"false"(json表示形式)接收。
if ( $(this).val() == "true" || $(this).val() == "false") {
ao[id] = JSON.parse($(this).val());
}else {
ao[id] = $(this).val();
}
String.prototype.bool = function() {
return (/^true$/i).test(this);
};
if ( $(this).val() == "true" || $(this).val() == "false") {
ao[id] = $(this).val().bool();
}else {
ao[id] = $(this).val();
}
('' + thisval).toLowerCase() === 'true'
如果额外的字符串和 toLower 可以忽略不计,那么可能会很简单。
只有当它明确设置为 true(布尔值或不区分大小写的字符串)时才为真,否则为假。
// so complete solution to get the same value if neither true nor false
const thisvalStr = ('' + thisval).toLowerCase();
a[id] = thisvalStr === 'true'? true: (thisvalStr === 'false')? false: thisval;
const TrueValuesStr = ['1', 'true']
TrueValueStr.contains(('' + thisval).toLowerCase() === 'true')
稍微
var thisval = $(this).val();
if (thisval === "true" || thisval === "false") {
thisval = (thisval === "true");
}
如果你想的话,你可以在一行代码中完成所有这些操作:
const getBool = value => value == "true" || value == "false" ? value == "true" : value;
getBool($(this).val());
解释
在 JavaScript 中,您可能会习惯使用类似以下的语句:
if(answer == "yes"){ ...
answer == "yes"
将会被计算为 true
或者 false
。
对于您的问题,这肯定可以帮助其中的一部分。如果只有 "true"
或者 "false"
这两个选项,那么就会非常简单:
const getBool = (value) => value == "true"
getBool("true"); // true
getBool("false"); // false
`if this` ? `then do this` : `if not, then do this`
value == "true" || value == "false"
value == "true" || value == "false" ? value == "true" : value;
我可能更喜欢
const parseMaybeBool = val =>
typeof val === 'string'
? val.toLowerCase() === 'true' || val.toLowerCase() === 'false'
? Boolean(val)
: val
: val;
或带类型
const isBool = (val: unknown): val is boolean =>
typeof val === 'boolean' ||
(typeof val === 'string' &&
(val.toLowerCase() === 'true' || val.toLowerCase() === 'false'));
const parseMaybeBool = (val: unknown) =>
isBool(val) ? Boolean(val) : val;
var thisval = $(this).val();
switch(thisval) {
case 'true' :
ao[id] = true;
break;
case 'false' :
ao[id] = false;
break;
default:
ao[id] = thisval;
}
我会创建一个数组来保存字符串为 true 或 false 时的两个可能值。然后,我会搜索看看 thisval
是否在该数组中。如果不在,则 indexOf
函数将返回 -1。之后,只需要遍历这些值并构建您想要的情况即可。
编辑:根据 Tibos 的建议,我已更新代码。谢谢!
$(this).val()
都是有用的,但我认为这段代码显得更加冗长。 - Mark Waltersswitch(thisval) { case 'true' : ao[id] = true; break; case 'false' : ao[id] = false; break; default: ao[id] = thisval; }
呢? - Tibosconst thisval = $(this).val();
ao[id] = ['true', 'false'].includes(thisval) ? JSON.parse(thisval) : thisval;
你还可以更进一步,让它也处理数字:
ao[id] = ['true', 'false'].includes(thisval) || !Number.isNaN(Number(thisval))
? JSON.parse(thisval)
: thisval;
var isBoolean = require('node-boolify').isBoolean;
isBoolean(true); //true
isBoolean('true'); //true
isBoolean('TRUE'); //false
isBoolean(1); //true
isBoolean(2); //false
isBoolean(false); //true
isBoolean('false'); //true
isBoolean('FALSE'); //false
isBoolean(0); //true
isBoolean(null); //false
isBoolean(undefined); //false
isBoolean(); //false
isBoolean(''); //false
布尔转换结果
var Boolify = require('node-boolify').Boolify;
Boolify(true); //true
Boolify('true'); //true
Boolify('TRUE'); //null
Boolify(1); //true
Boolify(2); //null
Boolify(false); //false
Boolify('false'); //false
Boolify('FALSE'); //null
Boolify(0); //false
Boolify(null); //null
Boolify(undefined); //null
Boolify(); //null
Boolify(''); //null