仅当值已定义时内联设置JavaScript对象属性的实现方案
解决Firebase Database仅更新已定义属性的问题
刚好我之前也处理过类似的Firebase数据更新场景,给你两种实用的实现方式,完美解决只推送已定义属性的需求:
方式一:手动判断构建更新对象
这种方式直观易懂,适合属性数量不多的场景,能清晰控制每个属性的判断逻辑:
// 假设sent是已存在的发出时间戳,delivered是本次可能要更新的送达时间戳 const sent = /* 已有的时间戳值 */; const delivered = /* 本次待更新的时间戳,可能有值或未定义 */; // 初始化空的更新对象 const updatePayload = {}; // 仅当属性已定义时,添加到更新对象中 if (typeof sent !== 'undefined') { updatePayload.sent = sent; } if (typeof delivered !== 'undefined') { updatePayload.delivered = delivered; } // 调用Firebase的update方法推送数据 firebase.database().ref('your/collection/path').update(updatePayload);
方式二:利用对象展开的简洁写法
如果想让代码更紧凑,可以用JavaScript的短路求值和对象展开语法,一行搞定对象构建:
const sent = /* 已有的时间戳值 */; const delivered = /* 本次待更新的时间戳,可能有值或未定义 */; // 仅展开已定义的属性到更新对象中 const updatePayload = { ...(typeof sent !== 'undefined' && { sent }), ...(typeof delivered !== 'undefined' && { delivered }) }; // 推送更新到Firebase firebase.database().ref('your/collection/path').update(updatePayload);
关键说明
- Firebase的
update()方法只会更新你传入对象中存在的属性,不会修改其他未提及的字段,所以只要我们的updatePayload只包含已定义的属性,就不会覆盖原有数据。 - 如果你需要区分“未定义”和“null”(比如允许设置null但不允许未定义的属性),可以把判断条件改成
sent !== null && typeof sent !== 'undefined',根据你的业务需求调整即可。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

