在 Javascript 个对象中深度合并

Deep merging in Javascript object

我有以下结构:

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)
}

注意:这也会检查原型链,所以在这种情况下您可能想使用 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)

在这种情况下,使用来自众所周知且经过充分测试的实用程序库(如 lodash)的 helper 也很有意义:

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