如何从对象获取值(默认值)


73

我经常发现自己将配置值传递给访问它们的函数,如下所示:

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

以后我像这样使用它们:

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

jQuery / ExtJS或任何其他框架是否提供了一种以简单的方式访问此类变量并为变量提供默认值的解决方案?

就像是:

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

还是为此提供标准解决方案。

注意:

我也在考虑您具有默认值的常见模式

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

并进行对象合并。

然后将对象编码为param String。但是如您所见,对象有时还包含参数名称。

Answers:


90

通常,当某些变量的值为falsy时,可以使用or运算符分配默认值:

var foo = couldBeUndefined || "some default";

所以:

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

假定config.args始终如您的示例代码所暗示的那样进行定义。


6
我相信如果config.args.arg1未定义也可以,但是如果config或者config.args本身未定义,这不会失败吗?
詹姆斯·怀斯曼

4
他暗示@ karim79config.args.arg1如果config.args === undefined
Raynos 2012年

29
这里有一个很大的缺陷。如果是couldBeUndefined = 0,或其他任何虚假的值,则foo = "some default",而不是得到期望的值foo = 0
Daniel Reina

6
如果值为false,则将失败。您应该做typeof x.y != 'undefined' ? x.y : "";
7H3 IN5ID3R

4
当arg为布尔值且默认值为true时,所有内容都会被破坏。
KIDJourney '17


5

使用ES2018,您现在可以编写options = { ...defaults, ...options }

传播语法-JavaScript | MDN

现在可以使用比短的语法进行浅克隆(不包括原型)或合并对象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 }

1
不知道为什么这被否决了。我给了FWIW一个
赞成票-demonkoryu

4

尝试 var options = extend(defaults, userOptions);

这样,您可以获得所有userOptions,并且在它们不传递任何选项时又退回到默认值。

请注意使用所需的任何extend实现。


4
extend通常会修改并返回其第一个参数。这意味着您通常需要extend({}, defaults, userOptions),因此默认值不会更改。
迈克尔·安德森

2
您的extension版本可能是一成不变的,但是我遇到的所有其他版本,包括jQuery(api.jquery.com/jQuery.extend),Lodash和underscore(underscorejs.org/#extend)的版本,都使用不变形式。
迈克尔·安德森

注意:也_.defaults有用于此目的的快捷方式。
sk29910 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.