gpt4 book ai didi

javascript - Javascript 对象中的深度合并

转载 作者:行者123 更新时间:2023-12-03 03:26:51 24 4
gpt4 key购买 nike

我有以下结构:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com