So erhalten Sie einen Wert von Object mit dem Standardwert

72

Ich übergebe ständig Konfigurationswerte an Funktionen, die wie folgt auf sie zugreifen:

var arg1 = 'test1';
if(isUndefined(config.args.arg1)){
  arg1 = config.args.arg1;
} 

var arg2 = 'param2';
if(isUndefined(config.args.arg2)){
  arg2 = config.args.arg2;
} 

var arg3 = '123';
if(isUndefined(config.args.arg3)){
  arg3 = config.args.arg3;
} 

wo ich sie später so benutze:

var url = '<some-url>?id='+arg1+'&='+arg2 +'=' + arg3;

Bietet jQuery / ExtJS oder ein anderes Framework eine Lösung, um auf einfache Weise auf solche Variablen zuzugreifen und Variablen einen Standardwert zu geben?

Etwas wie:

getValueOfObject(config,'args.arg3','<default>');

Oder gibt es dafür vielleicht eine Standardlösung.

HINWEIS:

Ich habe auch über das allgemeine Muster nachgedacht, bei dem Sie Standardeinstellungen haben

var defaults = {
   args: {
      args1: ....
   }
   ...
}

und eine Objektzusammenführung durchführen.

Und dann das Objekt in einen param String codieren. Aber wie Sie das Objekt sehen können Werte manchmal auch Parameternamen enthalten.

Jeremy S.
quelle

Antworten:

89

Im Allgemeinen kann der Operator oder verwendet werden , um einen Standardwert zuzuweisen, wenn eine Variable als falsch ausgewertet wird:

var foo = couldBeUndefined || "some default";

damit:

var arg1 = config.args.arg1 || "test";
var arg2 = config.args.arg2 || "param2";

Angenommen, dies config.argsist immer definiert, wie Ihr Beispielcode impliziert.

karim79
quelle
6
Ich glaube , dass es in Ordnung sein wird , wenn config.args.arg1nicht definiert ist, aber werden nicht dieses fehlschlagen , wenn configoder config.argsist selbst nicht definiert?
James Wiseman
4
@ Karim79 er impliziert, config.args.arg1wird werfen, wennconfig.args === undefined
Raynos
29
Hier gibt es einen großen Fehler. Wenn couldBeUndefined = 0oder irgendein anderer falscher Wert, dann foo = "some default"anstatt den gewünschten zu bekommenfoo = 0
Daniel Reina
6
Dies schlägt fehl, wenn der Wert falsch ist. Sie sollten tuntypeof x.y != 'undefined' ? x.y : "";
7H3 IN5ID3R
4
Wenn arg boolesch ist und der Standardwert true ist, ist alles ruiniert.
KIDJourney
19

Sieht so aus, als hätte lodash endlich die Funktion _.get () dafür!

Jeremy S.
quelle
5

Mit ES2018 können Sie jetzt schreiben options = { ...defaults, ...options }:

Spread-Syntax - JavaScript | MDN

Flaches Klonen (ohne Prototyp) oder Zusammenführen von Objekten ist jetzt mit einer kürzeren Syntax als möglich möglich Object.assign().

const obj1 = { foo: 'bar', x: 42 };
const obj2 = { foo: 'baz', y: 13 };

const clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }

const mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }
Clément
quelle
1
Keine Ahnung, warum dies abgelehnt wurde. Ich gab eine Gegenstimme FWIW
Demonkoryu
4

Versuchen var options = extend(defaults, userOptions);

Auf diese Weise erhalten Sie alle userOptions und greifen auf die Standardeinstellungen zurück, wenn sie keine Optionen übergeben.

Beachten extendSie, dass Sie eine beliebige Implementierung verwenden können .

Raynos
quelle
4
extendändert normalerweise und gibt sein erstes Argument zurück. Dies bedeutet, dass Sie normalerweise möchten extend({}, defaults, userOptions), damit die Standardeinstellungen nicht geändert werden.
Michael Anderson
2
Ihre Version von Extend ist zwar unveränderlich, aber alle anderen Versionen, auf die ich gestoßen bin, einschließlich der Versionen von jQuery ( api.jquery.com/jQuery.extend ), Lodash und Underscore ( underscorejs.org/#extend ), verwenden alle die nicht unveränderliche Form.
Michael Anderson
Hinweis: Es gibt auch die Verknüpfung _.defaultsfür genau diesen Zweck.
sk29910