javascript - Javascript 对象中的深度合并

标签 javascript object ecmascript-6 variable-assignment

我有以下结构:

database: {
 events: {}
}

我想实现以下目标或类似目标。

database.events[eventKey]["staff"][role].push(value)

eventKey、role和value都是变量。

有没有办法将其推送到这个数组?

也许可以用Object.assign()以某种方式?

最佳答案

一种直接但麻烦的方法是在尝试访问每个属性之前仅对其进行存在性检查:

if (
  database.events[eventKey] &&
  database.events[eventKey].staff &&
  database.events[eventKey].staff[role]
) {
  database.events[eventKey].staff[role].push(value)
}

注意:这还将检查原型(prototype)链,因此您可能想使用 hasOwnProperty在这种情况下。

如果多次执行这样的操作,创建一个执行此类属性提取的助手可能会很有用:

const getProp = (obj, path) => {
  const props = path.split('.');
  let val = obj;
  for (let prop of props) {
    val = val[prop];
    if (val === undefined || val === null) {
      return undefined;
    }
  }
  return val;
}

其用法如下:

const roles = getProp(database, `events.${eventKey}.staff.${role}`)
if (Array.isArray(roles)) {
  roles.push(value);
}

或者如果您不关心真实检查边缘情况,则可以使用默认后备:

(getProp(database, `events.${eventKey}.staff.${role}`) || []).push(value)

使用 helper在这种情况下,来自像 lodash 这样的知名且经过充分测试的实用程序库也有意义:

const getRole = _.property(`events.${eventKey}.staff.${role}`)
// ...
const role = getRole(database);
if (Array.isArray(role)) {
  role.push(value);
}

关于javascript - Javascript 对象中的深度合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46284256/

相关文章:

.net - 检测 .NET 对象的属性值的变化?

HTML 'td' 宽度和高度

javascript - 如何使用 webpack 动态导入

javascript - 了解 map 与对象 MDN 文档

java - 如何在 Java 中将 Object[] 转换为 String[]?

javascript - 如何得到这个输出? JavaScript ES6

javascript - 用于排除一些与起始字符串匹配的子文件夹的正则表达式

javascript - 根据 LESS/Javascript 中的条件对常见的 css 规则进行分组?

javascript - 显示 JSON 数组数据时遇到问题

javascript - javascript中的字符串长度验证