仅当定义了值时才向对象添加属性
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】:
另一种方法是将要添加的值放入数组中,然后使用filter
和forEach
(或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 消息