在Javascript中,如何有条件地将一个成员添加到一个对象?
我想创build一个有条件添加成员的对象。 简单的方法是:
var a = {}; if (someCondition) ab = 5;
现在,我想写一个更习惯的代码。 我在尝试:
a = { b: (someCondition? 5 : undefined) };
但是现在, b
是a
其值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... });
并获得您期望的结果(如果conditionB
为false
,则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