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

Javascript 基于布尔值的对象的排除属性,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个函数可以做到这一点 function example(senior) { return { manyotherProps: '123', isSenior: senior ? senior : undefined } } 但是示例函数仍然包含isSenior属性,尽管它尚未定义。我可以多次返回,但对象很大,我尽量避免重复 更新:isSenior是一个字符串值 您可以使用三元运算符在{isSenior}对象和{}对象之间交替,并将结果传播到要返回的对象中: 函数示例(is

我有一个函数可以做到这一点

function example(senior) {
 return {
  manyotherProps: '123',
  isSenior: senior ? senior : undefined
 }
}
但是示例函数仍然包含isSenior属性,尽管它尚未定义。我可以多次返回,但对象很大,我尽量避免重复

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

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

函数示例(isSenior){
返回{
许多其他道具:“123”,
…(isSenior?{isSenior}:{})
}
}
log(例如('foo'));

log(示例())我建议使用对象rest/spread语法

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

有时多重返回或变异实际上更清晰,但如果只有几个条件,则上述方法简洁明了

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


在您的示例中,未定义的/
null
字段不仅可以。它们更可取。不要试图避免重复。避免相同类型的对象具有不同的形状和/或属性初始化顺序。

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

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

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

  return res;
}

不太清楚为什么需要避免未定义的属性,但我尝试了这个方法,它对我有效:

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

function exam(senior) {
  var object = {
    manyotherProps: "123"
  };
  if (senior) {
    object.isSenior = senior;
  }
  return object;
}
选项2:如果senior为false,则删除

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

希望它能有所帮助。

如果(isSenior){return{…result,isSenior}}返回结果
如何,正如您在上面的代码中所看到的,对于
示例('foo')
,我也在使用字符串-如果您想使用条件运算符,可以使用spread来实现您想要的结果,如果
result
已经是一个对象,那么您也可以这样做-也许
返回isSenior?{…result,isSenior}:result
,但这需要创建两个对象,而实际上只需要一个