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.
3 Antworten
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.
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.
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