3514 Stimmen

Wie kann ich in JavaScript eine Zeichenkette in einen Booleschen Wert umwandeln?

Kann ich eine Zeichenkette, die einen booleschen Wert repräsentiert (z. B. 'true', 'false'), in einen intrinsischen Typ in JavaScript umwandeln?

Ich habe ein verstecktes Formular in HTML, das auf der Grundlage der Auswahl eines Benutzers in einer Liste aktualisiert wird. Dieses Formular enthält einige Felder, die boolesche Werte darstellen und dynamisch mit einem eigenen booleschen Wert befüllt werden. Sobald dieser Wert jedoch in das verborgene Eingabefeld eingegeben wird, wird er zu einem String.

Die einzige Möglichkeit, den booleschen Wert des Feldes nach der Konvertierung in eine Zeichenkette zu bestimmen, bestand darin, sich auf den literalen Wert der Zeichenkettendarstellung zu verlassen.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

Gibt es eine bessere Möglichkeit, dies zu erreichen?

0 Stimmen

Nur um ein seltsames Beispiel für die Vermeidung eines Dreifach-Gleichheits-Vergleichs hervorzuheben: Ich habe eine Funktion currentSortDirection() die zurückgibt 1 für eine aufsteigende Sortierung, 0 für eine absteigende Sortierung, und -1 für nicht gesetzt. Verwendung von while (currentSortDirection() != desiredSortDirection) { sortColumn() } funktioniert hervorragend, da -1 != true y -1 != false ...aber dies zu ändern in while (Boolean(currentSortDirection) !== ...) {...} Kräfte -1 in eine true was ein paar zusätzliche Zeilen an Vorbereitung erfordert, nur um jshint glücklich zu machen.

0 Stimmen

Mögliches Duplikat von stackoverflow.com/questions/263965

0 Stimmen

@Droogans: Was passiert, wenn desiredSortDirection wird eingestellt auf asc ? Ich weiß, dass Sie in einer kontrollierten Umgebung wahrscheinlich die Kontrolle über den Wert haben. desiredSortDirection auf aber in einer gemeinsamen Umgebung gesetzt wird, wenn die Eingabe von desiredSortDirection kann von überall und in jeder Form kommen, Typüberprüfung gegen benutzerdefinierte Objekte und defensive Programmierung kann viele Stunden der Fehlersuche sparen. Ihr Code ist absolut in Ordnung und es ist nichts daran auszusetzen. Ich weise lediglich darauf hin, dass es keine allgemeingültige Antwort/Lösung gibt und es immer vom Szenario abhängt.

159voto

Deepak paramesh Punkte 171

Dies ist der einfachste Weg, eine boolesche Konvertierung durchzuführen, auf den ich kürzlich gestoßen bin. Dachte, ich füge es hinzu.

JSON.parse('true');

let trueResponse = JSON.parse('true');

let falseResponse = JSON.parse('false');

console.log(trueResponse);
console.log(falseResponse);

19 Stimmen

Das funktioniert, aber man muss aufpassen, dass man ihm keine leeren Strings übergibt, sonst springt er ab.

13 Stimmen

Die sexy Lösung, sie hat mir gefallen!

7 Stimmen

Nimm mein ganzes Geld!

138voto

Shadow2531 Punkte 11620

Sie können reguläre Ausdrücke verwenden:

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

Wenn Sie die Klasse String erweitern möchten, können Sie das tun:

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

Für diejenigen (siehe die Kommentare), die das String-Objekt erweitern möchten, um dies zu erreichen, aber über die Aufzählbarkeit besorgt sind und sich Sorgen machen, mit anderem Code, der das String-Objekt erweitert, in Konflikt zu geraten:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(In älteren Browsern funktioniert das natürlich nicht, und Firefox zeigt false an, während Opera, Chrome, Safari und IE true anzeigen. Fehler 720760 )

10 Stimmen

Sie können der Funktion immer ein Präfix voranstellen, wenn Sie befürchten, dass sie mit anderem Code in Konflikt gerät. Wenn ein Teil des Codes trotzdem nicht funktioniert, ist dieser Code einfach zu brüchig und sollte korrigiert werden. Wenn die hinzugefügte Funktion das Objekt zu schwer macht, so dass es ein Leistungsproblem für anderen Code verursacht, dann sollte man das natürlich nicht tun. Aber ich denke nicht, dass es generell eine schlechte Idee ist, eingebaute Objekte zu erweitern. Sie wären auch nicht öffentlich erweiterbar, wenn das der Fall wäre.

42 Stimmen

@DTrejo @Szymon Da bin ich anderer Meinung. Das ist genau die Art von Sache, für die das Überladen des Prototyps gedacht ist. Wenn Sie Angst davor haben, dass (schlechter) Code, der sich auf for..in verlässt, kaputt geht, gibt es Möglichkeiten, Eigenschaften vor der Aufzählung zu verstecken. Siehe Object.defineProperty .

1 Stimmen

Ich mag die Einfachheit des Regex-Ansatzes, um nach Werten zu suchen, die typischerweise "wahr" sind. Ein Vorschlag zur Änderung: Die Logik von "false" ist 0 und true ist ungleich Null. Daher halte ich es für besser, auf das Gegenteil von false zu prüfen, d. h. return !(/^(false|0|off|no)$/i).test(this); -- beachten Sie auch, dass ich "nein" hinzugefügt habe.

84voto

Stefan Steiger Punkte 72861

Wood-eye sei vorsichtig. Nachdem ich gesehen habe, welche Konsequenzen es hat, wenn man die beste Antwort mit mehr als 500 Bewertungen anwendet, fühle ich mich verpflichtet, etwas zu schreiben, das tatsächlich nützlich ist:

Beginnen wir mit dem kürzesten, aber sehr strengen Weg:

var str = "true";
var mybool = JSON.parse(str);

Und mit einer angemessenen, toleranteren Art zu enden:

var parseBool = function(str) 
{
    // console.log(typeof str);
    // strict: JSON.parse(str)

    if(str == null)
        return false;

    if (typeof str === 'boolean')
    {
        return (str === true);
    } 

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

Prüfung:

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

1 Stimmen

If(str == null) return false; gibt jedes Mal einen Zufallsfehler zurück, wenn eine Eingabe fälschlicherweise auf null initialisiert wird. Toleranz ist in den meisten Fällen keine wünschenswerte Eigenschaft:

56voto

BrDaHa Punkte 4437

Ich dachte, dass die Antwort von @Steven die beste war und sich um viel mehr Fälle kümmerte, als wenn der eingehende Wert nur eine Zeichenkette war. Ich wollte sie ein wenig erweitern und Folgendes anbieten:

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

Es ist nicht notwendig, alle Bereiche der false Fällen, wenn Sie bereits alle Informationen über true Fälle, die Sie berücksichtigen müssen. Sie können dieser Methode alles übergeben, was als true Wert (oder fügen Sie andere hinzu, es ist ziemlich einfach), und alles andere würde als false

47voto

Jan Remunda Punkte 7680

Universelle Lösung mit JSON-Parsing:

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

UPDATE (ohne JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

Ich habe auch ein Fiddle erstellt, um es zu testen http://jsfiddle.net/remunda/2GRhG/

1 Stimmen

Die Version "ohne JSON" hat einen Fehler: val="0" ; console.log(!!(+val||String(val).toLowerCase().replace(!!0,'')) ); ergibt true

4 Stimmen

getBool(undefined) stürzt ab, wenn die ursprüngliche JSON-Version verwendet wird, und gibt true für die zweite Version zurück. Hier ist eine 3. Version, die false zurückgibt: function getBool(val) { var num; return val != null && (!isNaN(num = +val) ? !!num : !!String(val).toLowerCase().replace(!!0,'')); }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X