JavaScript : 문자열 부울 값 구문 분석?
이 질문에 이미 답변이 있습니다.
자바 스크립트는 없습니다 parseInt()
와 parseFloat()
,하지만 거기에 parseBool
또는 parseBoolean
내가 알고 있어요까지로, 전역에 방법.
"true"또는 "false"와 같은 값이있는 문자열을 가져와 JavaScript를 반환하는 메서드가 필요합니다 Boolean
.
내 구현은 다음과 같습니다.
function parseBool(value) {
return (typeof value === "undefined") ?
false :
// trim using jQuery.trim()'s source
value.replace(/^\s+|\s+$/g, "").toLowerCase() === "true";
}
이것은 좋은 기능입니까? 피드백을주세요.
감사!
나는 삼진법으로 한 라이너를 사용하는 경향이 있습니다.
var bool_value = value == "true" ? true : false
편집 : 논리 문을 사용하지 않고 대신 표현식 자체를 사용하는 것이 더 빠릅니다.
var bool_value = value == 'true';
이것은 변수가 문자열 value == 'true'
인지 여부에 따라 평가 되기 때문에 작동 합니다 . 만약 그렇다면 그 전체 표현식은 이고 그렇지 않으면, 그 결과는 평가 후에 할당됩니다 .value
'true'
true
false
bool_value
이를 위해 JSON.parse를 사용할 수 있습니다.
JSON.parse("true"); //returns boolean true
기능 작동 방식에 따라 다릅니다.
문자열 내부에서 'true'라는 단어를 테스트하고 거짓이없는 문자열 (또는 문자열이 아닌)을 정의하는 것뿐이라면 가장 쉬운 방법은 다음과 같습니다.
function parseBoolean(str) {
return /true/i.test(str);
}
전체 문자열이 true라는 단어를 확인하려면 다음과 같이 할 수 있습니다.
function parseBoolean(str) {
return /^true$/i.test(str);
}
다음을 시도 할 수 있습니다.
function parseBool(val)
{
if ((typeof val === 'string' && (val.toLowerCase() === 'true' || val.toLowerCase() === 'yes')) || val === 1)
return true;
else if ((typeof val === 'string' && (val.toLowerCase() === 'false' || val.toLowerCase() === 'no')) || val === 0)
return false;
return null;
}
유효한 값이면 동등한 bool 값을 반환하고 그렇지 않으면 null을 반환합니다.
개인적으로 false
사용 사례에 따라 함수가 유효하지 않은 값을 "숨기고" 반환하지 않는 것이 좋지 않다고 생각 true
합니다 "1"
.
또 다른 문제는 문자열이 아닌 모든 것에 대해 짖는다는 것입니다.
다음과 같이 사용합니다.
function parseBool(value) {
if (typeof value === "string") {
value = value.replace(/^\s+|\s+$/g, "").toLowerCase();
if (value === "true" || value === "false")
return value === "true";
}
return; // returns undefined
}
그리고 사용 사례에 따라 확장하여 "0"
및 "1"
.
(한 번만 비교하는 방법이 "true"
있을지 모르지만 지금은 생각할 수 없었습니다.)
JSON.parse 또는 jQuery.parseJSON을 사용하고 다음과 같이 true를 반환하는지 확인할 수 있습니다.
function test (input) {
try {
return !!$.parseJSON(input.toLowerCase());
} catch (e) { }
}
다음 코드를 추가 할 수 있습니다.
function parseBool(str) {
if (str.length == null) {
return str == 1 ? true : false;
} else {
return str == "true" ? true : false;
}
}
다음과 같이 작동합니다.
parseBool(1) //true
parseBool(0) //false
parseBool("true") //true
parseBool("false") //false
단순하게 유지하지 않는 이유는 무엇입니까?
var parseBool = function(str) {
if (typeof str === 'string' && str.toLowerCase() == 'true')
return true;
return (parseInt(str) > 0);
}
목눈 조심하세요. 이 모든 코드를 살펴본 후 다음을 게시해야합니다.
가장 짧지 만 매우 엄격한 방법으로 시작하겠습니다.
var str = "true";
var mybool = JSON.parse(str);
그리고 적절하고 더 관대 한 방법으로 끝내십시오.
var parseBool = function(str)
{
// console.log(typeof str);
// strict: JSON.parse(str)
if(str == null)
return false;
if (typeof str === 'boolean')
{
if(str === true)
return true;
return false;
}
if(typeof str === 'string')
{
if(str == "")
return false;
str = str.replace(/^\s+|\s+$/g, '');
if(str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
return true;
str = str.replace(/,/g, '.');
str = str.replace(/^\s*\-\s*/g, '-');
}
// var isNum = string.match(/^[0-9]+$/) != null;
// var isNum = /^\d+$/.test(str);
if(!isNaN(str))
return (parseFloat(str) != 0);
return false;
}
테스트 :
var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", " true ", " TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");
var array_2 = new Array(null, "", false, "false", " false ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");
for(var i =0; i < array_1.length;++i){ console.log("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}
for(var i =0; i < array_1.length;++i){ console.log(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log(parseBool(array_2[i]));}
나는 RoToRa가 제공하는 솔루션을 좋아합니다 (부울 의미가 있으면 주어진 값을 구문 분석하고 그렇지 않으면하지 마십시오). 그럼에도 불구하고 매개 변수 를 지원하는 C #의 Boolean.TryParse 와 비슷하게 작동하도록 약간의 수정을 제공하고 싶습니다 out
. JavaScript에서는 다음과 같은 방식으로 구현할 수 있습니다.
var BoolHelpers = {
tryParse: function (value) {
if (typeof value == 'boolean' || value instanceof Boolean)
return value;
if (typeof value == 'string' || value instanceof String) {
value = value.trim().toLowerCase();
if (value === 'true' || value === 'false')
return value === 'true';
}
return { error: true, msg: 'Parsing error. Given value has no boolean meaning.' }
}
}
사용법 :
var result = BoolHelpers.tryParse("false");
if (result.error) alert(result.msg);
stringjs에는 toBoolean () 메서드가 있습니다.
http://stringjs.com/#methods/toboolean-tobool
S('true').toBoolean() //true
S('false').toBoolean() //false
S('hello').toBoolean() //false
S(true).toBoolean() //true
S('on').toBoolean() //true
S('yes').toBoolean() //true
S('TRUE').toBoolean() //true
S('TrUe').toBoolean() //true
S('YES').toBoolean() //true
S('ON').toBoolean() //true
S('').toBoolean() //false
S(undefined).toBoolean() //false
S('undefined').toBoolean() //false
S(null).toBoolean() //false
S(false).toBoolean() //false
S({}).toBoolean() //false
S(1).toBoolean() //true
S(-1).toBoolean() //false
S(0).toBoolean() //false
나는 파렴치하게 Apache CommontoBoolean
을 JavaScript 로 변환했습니다 .
JSFiddle : https://jsfiddle.net/m2efvxLm/1/
암호:
function toBoolean(str) {
if (str == "true") {
return true;
}
if (!str) {
return false;
}
switch (str.length) {
case 1: {
var ch0 = str.charAt(0);
if (ch0 == 'y' || ch0 == 'Y' ||
ch0 == 't' || ch0 == 'T' ||
ch0 == '1') {
return true;
}
if (ch0 == 'n' || ch0 == 'N' ||
ch0 == 'f' || ch0 == 'F' ||
ch0 == '0') {
return false;
}
break;
}
case 2: {
var ch0 = str.charAt(0);
var ch1 = str.charAt(1);
if ((ch0 == 'o' || ch0 == 'O') &&
(ch1 == 'n' || ch1 == 'N') ) {
return true;
}
if ((ch0 == 'n' || ch0 == 'N') &&
(ch1 == 'o' || ch1 == 'O') ) {
return false;
}
break;
}
case 3: {
var ch0 = str.charAt(0);
var ch1 = str.charAt(1);
var ch2 = str.charAt(2);
if ((ch0 == 'y' || ch0 == 'Y') &&
(ch1 == 'e' || ch1 == 'E') &&
(ch2 == 's' || ch2 == 'S') ) {
return true;
}
if ((ch0 == 'o' || ch0 == 'O') &&
(ch1 == 'f' || ch1 == 'F') &&
(ch2 == 'f' || ch2 == 'F') ) {
return false;
}
break;
}
case 4: {
var ch0 = str.charAt(0);
var ch1 = str.charAt(1);
var ch2 = str.charAt(2);
var ch3 = str.charAt(3);
if ((ch0 == 't' || ch0 == 'T') &&
(ch1 == 'r' || ch1 == 'R') &&
(ch2 == 'u' || ch2 == 'U') &&
(ch3 == 'e' || ch3 == 'E') ) {
return true;
}
break;
}
case 5: {
var ch0 = str.charAt(0);
var ch1 = str.charAt(1);
var ch2 = str.charAt(2);
var ch3 = str.charAt(3);
var ch4 = str.charAt(4);
if ((ch0 == 'f' || ch0 == 'F') &&
(ch1 == 'a' || ch1 == 'A') &&
(ch2 == 'l' || ch2 == 'L') &&
(ch3 == 's' || ch3 == 'S') &&
(ch4 == 'e' || ch4 == 'E') ) {
return false;
}
break;
}
default:
break;
}
return false;
}
console.log(toBoolean("yEs")); // true
console.log(toBoolean("yES")); // true
console.log(toBoolean("no")); // false
console.log(toBoolean("NO")); // false
console.log(toBoolean("on")); // true
console.log(toBoolean("oFf")); // false
Inspect this element, and view the console output.
마지막으로, 기본값으로 간단하고 효율적으로 수행 할 수 있습니다.
ES5
function parseBool(value, defaultValue) {
return (value == 'true' || value == 'false' || value === true || value === false) && JSON.parse(value) || defaultValue;
}
ES6, 더 짧은 1 개의 라이너
const parseBool = (value, defaultValue) => ['true', 'false', true, false].includes(value) && JSON.parse(value) || defaultValue
JSON.parse는 부울을 구문 분석하는 데 효율적입니다.
Enough to using eval javascript function to convert string to boolean
eval('true')
eval('false')
참고URL : https://stackoverflow.com/questions/5219105/javascript-parsing-a-string-boolean-value
'developer tip' 카테고리의 다른 글
Visual Studio에서 '웹 사이트'와 '프로젝트'의 차이점 (0) | 2020.11.14 |
---|---|
Python에 익명의 클래스가 있습니까? (0) | 2020.11.14 |
Vim에서 다른 텍스트 열 뒤에 텍스트 열을 어떻게 붙여 넣나요? (0) | 2020.11.14 |
테이블 셀의 최대 높이를 설정하는 방법은 무엇입니까? (0) | 2020.11.14 |
JavaFX-setVisible은 요소를 "숨기지"않습니다. (0) | 2020.11.14 |