基于布尔值排除对象的属性

时间:2018-10-04 02:33:26

标签: javascript ecmascript-6

我有一个执行此操作的功能

function example(senior) {
 return {
  manyotherProps: '123',
  isSenior: senior ? senior : undefined
 }
}

,但示例函数仍包含isSenior属性,尽管未定义。我可以进行多次返回,但是对象很大,我尽量避免重复。

  • 更新:isSenior是一个字符串值

5 个答案:

答案 0 :(得分:3)

不太清楚为什么需要避免使用undefined属性,但是我尝试了这一点,并且对我有用:

选项1:如果前者为true,则插入

function exam(senior) {
  var object = {
    manyotherProps: "123"
  };
  if (senior) {
    object.isSenior = senior;
  }
  return object;
}

选项2:如果前辈为假,则删除

function exam(senior) {
  var object = {
    manyotherProps: "123",
    isSenior: senior
  };
  if (!senior) {
    delete object.isSenior;
  }
  return object;
}

希望这会有所帮助。

答案 1 :(得分:0)

您可以使用三元运算符在{ isSenior }对象和{}对象之间交替,然后将结果散布到要返回的对象中:

function example(isSenior) {
 return {
  manyotherProps: '123',
  ...( isSenior ? { isSenior } : {} )
 }
}
console.log(example('foo'));
console.log(example());

也就是说,虽然这是可能的,但我认为,如果需要的话,以后使用if来分配给属性时,代码将更清晰易读:

function example(isSenior) {
 const obj = {
  manyotherProps: '123'
 };
 if (isSenior) obj.isSenior = isSenior;
 return obj;
}
console.log(example('foo'));
console.log(example());

答案 2 :(得分:0)

我建议对象休息/传播语法

function example(senior) {
  const result = {
    manyotherProps: '123'
  };
  return isSenior
    ? {senior, ...result};
    : result;
}

有时候,多次收益或突变实际上更为清晰,但如果只有少数条件,则上述方法是简洁明了的

答案 3 :(得分:0)

从性能的角度来看,函数返回的对象始终具有相同的形状(以相同的顺序初始化属性)是有益的。原因是modern JIT optimizations,例如hidden classes。不仅V8可以利用这一优势,所有流行的JS JIT引擎都使用类似的优化。

如您示例中的

Undefined / null字段不行。它们是优选的。不要试图避免重复。避免相同类型的对象具有不同的形状和/或属性初始化顺序。

答案 4 :(得分:0)

当然,没有直接的方法可以实现,一种解决方案是手动删除不需要的属性。

function example(senior) {
  let res = {
    manyotherProps: '123',
    isSenior: senior ? senior : undefined
  }

  Object.keys(res).forEach(t => res[t] === undefined && delete res[t]);

  return res;
}