我有以下结构:
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/