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

var a = {};
if (someCondition)
    a.b = 5;

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

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

但是现在,b是a的一个元素,它的值是未定义的。这不是我们想要的结果。

有没有方便的解决办法?

更新

我寻求一个解决方案,可以处理一般情况与几个成员。

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

当前回答

这是我能想到的最简洁的解决方案:

var a = {};
conditionB && a.b = 5;
conditionC && a.c = 5;
conditionD && a.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));

我的建议如下:

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,条件b,条件c,条件; 条件c = true; A = {}; 对象。赋值(a, conditionB ?{b: 1}: null, conditionC吗?{c: 2}: null, conditionD吗?{d: 3}: null); console.log(一个);

一些评论:

对象。Assign会原地修改第一个参数,但它也会返回更新后的对象:所以你可以在一个更大的表达式中使用这个方法来进一步操作对象。 而不是null,你可以传递undefined或{},有相同的结果。您甚至可以提供0,因为原始值被包装了,而Number没有自己的可枚举属性。

更简洁

进一步考虑第二点,你可以把它缩短如下(正如@Jamie指出的那样),因为假值没有自己的可枚举属性(false, 0, NaN, null, undefined,”,除了document.all):

Object.assign(a, conditionB && { b: 1 },
                 conditionC && { c: 2 },
                 conditionD && { d: 3 });

条件a,条件b,条件c,条件d; conditionC = "this is true "; 条件= NaN;/ / falsy a = {}; 物体。assign(a,条件b && {b: 1}, 条件&& {c: 2}, 条件&& {d: 3}); console.log (a);

更简化,

const a = {
    ...(condition && {b: 1}) // if condition is true 'b' will be added.
}

简单的es6解决方案

带有(&)的单一条件

const didIPassExam = true Const study = { 星期一:“写作”, 周二:“阅读”, /*有条件检查,如果为真,则增加周三学习*/ ...(didIPassExam &&{星期三:'睡得开心'}) } console.log(研究)

带有(?):)

Const分数= 110 //const得分= 10 Const storage = { 答:10 b: 20, ...(得分> 100 ?{c: 30}: {d:40}) } console.log(存储)

解释

假设你有一个这样的存储对象

const storage = {
  a : 10,
  b : 20,
}

你想在此基础上有条件地增加一个道具

const score = 90

如果分数大于100,您现在希望将道具c:30添加到存储区。

如果score小于100,则需要将d:40添加到存储中。你可以这样做

const score = 110

const storage = {
  a:10,
  b:20,
  ...(score > 100  ? {c: 30} : {d:40}) 
}

上面的代码给出存储为

{
  a: 10,
  b: 20,
  c: 30
}

如果分数= 90

然后你得到存储

{
  a: 10,
  b: 20,
  d: 40
}

Codepen例子