web-dev-qa-db-ja.com

JavaScript:文字列ブール値の解析?

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";
}

これは良い機能ですか?フィードバックをお願いします。

ありがとう!

私は三連の場合、1ライナーを行う傾向があります。

var bool_value = value == "true" ? true : false

編集:さらに速いのは、単純に論理ステートメントの使用を避け、代わりに式自体を使用することです:

var bool_value = value == 'true';

これは、value == 'true'変数がvalue変数が'true'の文字列かどうかに基づいて評価されるため、機能します。そうである場合、その式全体がtrueになり、そうでない場合はfalseになり、その結果は評価後にbool_valueに割り当てられます。

74
RGB

そのためにJSON.parseを使用できます:

JSON.parse("true"); //returns boolean true
33
F.Alves

機能をどのように機能させるかによって異なります。

文字列内の単語「true」をテストし、それがfalseでない文字列(または非文字列)を定義するだけであれば、最も簡単な方法はおそらく次のとおりです。

function parseBoolean(str) {
  return /true/i.test(str);
}

文字列全体が真の言葉であることを保証したい場合、これを行うことができます:

function parseBoolean(str) {
  return /^true$/i.test(str);
}
14

以下を試すことができます:

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;
}

有効な値の場合、同等のブール値を返します。それ以外の場合、nullを返します。

10
Paul Fleming

このコードを追加できます:

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
3
CodeGems

JSON.parseまたはjQuery.parseJSONを使用して、次のようなものを使用してtrueを返すかどうかを確認できます。

function test (input) {
    try {
        return !!$.parseJSON(input.toLowerCase());
    } catch (e) { }
}
3
rsp

個人的には、あなたの関数は無効な値をfalseとして「隠し」、あなたのユースケースによっては"1"に対して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"に対して一度だけ比較する方法があるかもしれませんが、私は今何かを考えることができませんでした。)

3
RoToRa

シンプルに保ちませんか?

var parseBool = function(str) {
    if (typeof str === 'string' && str.toLowerCase() == 'true')
            return true;

    return (parseInt(str) > 0);
}
2
MiniGod

ウッドアイ注意してください。このすべてのコードを見た後、私は投稿する義務があると感じています:

最短だが非常に厳しい方法から始めましょう:

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]));}
2
Stefan Steiger

私は恥知らずに Apache CommonのtoBoolean 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.
0
Xaero Degreaz

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
0
prule

RoToRaが提供するソリューションが好きです(ブール値の意味がある場合は指定された値を解析し、そうでない場合はしないでください)。それにも関わらず、out paramsをサポートするC#の Boolean.TryParse のように、多少の変更を加えて少し変更したいと思います。 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);
0
jwaliszko

最後になりましたが、デフォルト値でそれを行う簡単で効率的な方法:

ES5

function parseBool(value, defaultValue) {
    return (value == 'true' || value == 'false' || value === true || value === false) && JSON.parse(value) || defaultValue;
}

ES6、短いライナー

const parseBool = (value, defaultValue) => ['true', 'false', true, false].includes(value) && JSON.parse(value) || defaultValue

JSON.parseはブール値を解析するのに効率的です

0
Sebastien H.