仅当定义了值时才向对象添加属性

Posted

技术标签:

【中文标题】仅当定义了值时才向对象添加属性【英文标题】:Add property to object only if value is defined 【发布时间】:2018-07-18 00:23:21 【问题描述】:

只有在定义了值的情况下,才有更好的方法向对象添加属性:

const destination = ;
const value = getValue();

if (_(value).isObject())  // In this case, I only want an object
    destination.value = value;

在这种情况下,destination.value 属性仅在 value 具有值时才存在。有没有更好的方法来做到这一点?

【问题讨论】:

if (value) 通常,当您知道该值不会是您想要保留的虚假值时。 【参考方案1】:
if(typeof value != 'undefined')

除非您也想排除 null(null 是 javascript 中的对象)。在这种情况下:

if(typeof value != 'undefined' && value !=null) 

【讨论】:

这是一个对象与是否为空或未定义之间的正常比较。问题是将此值作为属性添加到对象中。 @SebastianPaduano 我的想法是,添加值将进入 IF 语句的主体 - 但你是对的,我没有明确表示。【参考方案2】:

您也可以使用Object(value) === value 进行对象测试并使用Object.assign 执行条件赋值:

Object.assign(destination, Object(value) === value &&  value );

这是否“更好”值得商榷。选择你最喜欢和最符合你期望的东西。

【讨论】:

【参考方案3】:

更新

这是一个更好的方法,

const destination = ;
const value = getValue();
destination = 
    ...destination, 
    ...value && (value)

这里假设您想创建一个名称为 value 的密钥。

另一种方法

就这样吧,

const destination = ;
const value = getValue();

value && (destination.value = value); // here is the one liner way

这将确保 value 属性只有在 value 被定义时才会被创建

【讨论】:

【参考方案4】:

使用 ES6,我喜欢做条件传播:

const value = getValue()
const destination = 
  ...(value ?  value  : )

你可以在三元中做任何你需要的布尔检查。在您的情况下,检查 value 是否是一个对象。

【讨论】:

这与 OP 的设置有点不同,在调用 getValue() 函数之前,destination 已经作为 const 存在。 扩展语法不适用于 ES6 中的对象。它仍然是stage 3 proposal。 很好,帕特里克!它现在正式进入第 4 阶段,所以这应该很好。 这应该是最佳答案。【参考方案5】:

另一种方法是将要添加的值放入数组中,然后使用filterforEach(或reduce)将其添加到destination 对象中。

const destination = 
const propsToAdd = [ key: 'value', value: getValue() ]

propsToAdd
 .filter(data => _.isObject(data.value))
 .forEach(data => destination[data.key] = data.value);

这样您还可以向对象添加一个函数,您可以在filter 中使用该函数来验证其他类型而不仅仅是对象。

【讨论】:

以上是关于仅当定义了值时才向对象添加属性的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中

Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息

仅当表中不存在该值时才更新 SQL 列

仅当它是数组中的值时才可以打印数字吗? (Java)[重复]

仅当它在 AngularJs 中有值时才需要下拉

MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置