在Javascript中,如何有条件地将一个成员添加到一个对象?

我想创build一个有条件添加成员的对象。 简单的方法是:

var a = {}; if (someCondition) ab = 5; 

现在,我想写一个更习惯的代码。 我在尝试:

 a = { b: (someCondition? 5 : undefined) }; 

但是现在, ba其值undefined的成员。 这不是理想的结果。

有一个方便的解决scheme吗?

更新

我寻求一个解决scheme,可以处理与一些成员的一般情况。

 a = { b: (conditionB? 5 : undefined), c: (conditionC? 5 : undefined), d: (conditionD? 5 : undefined), e: (conditionE? 5 : undefined), f: (conditionF? 5 : undefined), g: (conditionG? 5 : undefined), }; 

在纯Javascript中,我想不出比你的第一个代码片段更通俗。

但是,如果使用jQuery库不是没有问题的,那么$ .extend()应该符合你的要求,因为正如文档所说:

未定义的属性不会被复制。

因此,你可以写:

 var a = $.extend({}, { b: conditionB ? 5 : undefined, c: conditionC ? 5 : undefined, // and so on... }); 

并获得您期望的结果(如果conditionBfalse ,则b不会存在于a )。

我觉得@InspiredJW是用ES5做的,而@trincot指出,使用es6是一个更好的方法。 但是我们可以通过使用扩展算子和逻辑AND短路评估来添加更多的糖:

 const a = { ...someCondition && {b: 5} } 

使用EcmaScript2015,您可以使用Object.assign

 Object.assign(a, conditionB ? { b: 1 } : null, conditionC ? { c: 2 } : null, conditionD ? { d: 3 } : null); 
 var a, conditionB, conditionC, conditionD; conditionC = true; a = {}; Object.assign(a, conditionB ? { b: 1 } : null, conditionC ? { c: 2 } : null, conditionD ? { d: 3 } : null); console.log(a); 

如果目标是让对象看起来是独立的,并且位于一组大括号内,那么可以试试这个:

 var a = new function () { if (conditionB) this.b = 5; if (conditionC) this.c = 5; if (conditionD) this.d = 5; }; 

如果你想做这个服务器端(没有jQuery),你可以使用lodash 4.3.0:

 a = _.pickBy({ b: (someCondition? 5 : undefined) }, _.negate(_.isUndefined)); 

这个工作使用lodash 3.10.1

 a = _.pick({ b: (someCondition? 5 : undefined) }, _.negate(_.isUndefined)); 

我会这样做

 var a = someCondition ? { b: 5 } : {}; 

用一行代码版本编辑

这个问题早已得到回答,但是看到其他的想法,我想出了一些有趣的派生词:

将未定义的值分配给相同的属性,然后将其删除

使用匿名构造函数创build对象,并始终将未定义的成员分配给最后移除的同一个虚拟成员。 这会给你一个单行(不是太复杂,我希望)每个成员+最后一行增加一行。

 var a = new function() { this.AlwaysPresent = 1; this[conditionA ? "a" : "undef"] = valueA; this[conditionB ? "b" : "undef"] = valueB; this[conditionC ? "c" : "undef"] = valueC; this[conditionD ? "d" : "undef"] = valueD; ... delete this.undef; }; 

我认为你有条件地添加成员的第一种方法是非常好的。 我不同意不想有一个undefined值的成员b 。 用in运算符添加一个undefined检查使用for循环是很简单的。 但无论如何,你可以很容易地写一个函数来过滤出undefined成员。

 var filterUndefined = function(obj) { var ret = {}; for (var key in obj) { var value = obj[key]; if (obj.hasOwnProperty(key) && value !== undefined) { ret[key] = value; } } return ret; }; var a = filterUndefined({ b: (conditionB? 5 : undefined), c: (conditionC? 5 : undefined), d: (conditionD? 5 : undefined), e: (conditionE? 5 : undefined), f: (conditionF? 5 : undefined), g: (conditionG? 5 : undefined), }); 

您也可以使用delete操作符来编辑对象。

如何使用增强对象属性,只设置属性如果是真的,例如:

 [isConditionTrue() && 'propertyName']: 'propertyValue' 

所以如果条件不符合,它不会创build首选属性,因此可以丢弃它。 请参阅: http : //es6-features.org/#ComputedPropertyNames