Können Sie Bedingungen in einer JavaScript-Objektliteraldefinition verwenden?

Was ich meine ist, anstatt:

if(flag)
{
    return { value1: getval(), value2: getval2()};
}
else
{
    return { value1: getval()};
}

Gibt es eine Möglichkeit, etwas zu tun wie:

return { value1: getval(), flag?(value2: getval2())};

Ich weiß, dass ich tun könnte:

return { value1: getval(), value2: flag?getval2():null };

Auf diese Weise wird das Mitglied value2 unabhängig vom Wert von flag definiert.

1
TarkaDaal 17 Aug. 2015 im 13:09

3 Antworten

Beste Antwort

Ich glaube nicht, dass Sie es ordentlich in einer Zeile machen können, aber es wäre einfach genug, so etwas zu machen:

var json = { value1: getval() };
if (flag) json.value2 = getval2();
return json;

Es sind noch ein paar Zeilen, aber es bedeutet auch, dass Sie sich nicht wiederholen müssen.


Wenn Sie dies wirklich in einer Zeile tun möchten und bereits underscore.js verwenden, finden Sie hier eine Alternative, die {{X0} verwendet }:

return _.extend({ value1: getval() }, flag ? { value2: getval2() } : {});

Es ist etwas kürzer, aber ich persönlich würde den ersten Ansatz empfehlen.

4
Tom Fenech 17 Aug. 2015 im 10:25

Es ist viel einfacher, die Bedingung einfach außerhalb des Objekts zu platzieren, anstatt zu schreiben:

return { value1: getval(), flag?(value2: getval2())};

Du wirst brauchen:

return flag ? { value1: getval(), value2: getval2()} : { value1: getval()};

Dies ist eine einfache DEMO:

function test(flag) {
  return flag ? {value1: "value1", value2: "value2"} : {value1: "value1"};
}

console.log(test(true));
console.log(test(false));

Die Ausgabe ist die folgende:

test (true) ---> {value1: "value1", value2: "value2"}

test (false) ---> {value1: "value1"}

Es verwendet dieselbe Logik wie die if-Anweisung, die Sie in Ihrer Frage verwendet haben, jedoch mit der Bedingter ternärer Operator in der return-Anweisung mit einer einzeiligen Lösung.

0
cнŝdk 17 Aug. 2015 im 13:13

UPDATE

Okey, wenn Sie also value2 nur einstellen möchten, wenn flag == true, gehen Sie wie folgt vor:

var flag = false;

function getreturn() {
    var return_val = { value1: getval() };
    if (flag==true) { return_val.value2 = getval2() }
    return return_val;
}

function getval() {
    return "hello";
}

function getval2() {
    return "world";
}

console.log(getreturn());

JSFiddle: http://jsfiddle.net/omxqs61g/2/

Auf diese Weise setzen Sie nur value2, wenn flag == true, und lassen die Variable unberührt, wenn sie falsch ist.

Auch die Antwort lautet an dieser Stelle: Nein, das kannst du nicht. Der Grund ist ganz einfach: Mit var name = {..} deklarieren Sie ein Objekt mit seinen Parametern. Diese Deklaration hat einige Regeln und diese kurzen if Prüfungen sind nicht innerhalb der Regeln.

Ich lasse die alte Antwort hier, vielleicht kann sie jedem helfen.

ALTE Antwort

(Nicht so, wie es das OP wollte. Alles hier unten stammt von der alten Antwort, sogar vom Teil Bearbeiten.)

Ja, du kannst.

Schauen Sie sich folgenden Code an:

var flag = false;

function getreturn() {
    return { value1: getval(), value2: flag ? getval2() : null };
}

function getval() {
    return "hello";
}

function getval2() {
    return "world";
}

console.log(getreturn());

JSFiddle: http://jsfiddle.net/omxqs61g/1/

Wenn flag true ist, erhalten Sie:

Object {value1: "hello", value2: "world"}

Andernfalls erhalten Sie:

Object {value1: "hello", value2: null}

Wenn Sie für flag keinen Booleschen Wert verwenden, können Sie auch überprüfen, ob typeof flag !== 'undefined'. Dies sollte auch funktionieren, wenn er nicht definiert ist.

BEARBEITEN

Ich habe die Frage noch einmal gelesen und bin mir nicht sicher, ob ich sie richtig verstanden habe. Wenn die eigentliche Frage lautet: Wenn es möglich ist, "value" nicht auf flag != true zu setzen, würde ich empfehlen, dies nicht zu tun!"

Hier mein Zitat aus meinem Kommentar:

Ich empfehle, dies nicht zu tun! Ich habe dies versehentlich in meinem letzten Projekt getan und bedauere diese Entscheidung, weil es auf diese Weise zu inkonsistent ist und in Zukunft zu härterer Arbeit führen wird. Setzen Sie besser immer value2 und prüfen Sie, ob es value2! = Null ist

-1
Cagatay Ulubay 17 Aug. 2015 im 12:03