javascript - 动态生成 javascript 对象的创造性方法
问题描述
我正在使用 javascript 对象,需要在对象结构的深处设置一个值。
让我们说:
a.b.c.d.e.f.g = "some value";
我不知道是否所有这些对象都已创建,所以我最终做了:
a = a || {};
a.b = a.b || {};
a.b.c = a.b.c || {};
a.b.c.d = a.b.c.d || {};
a.b.c.d.e = a.b.c.d.e || {};
a.b.c.d.e.f = a.b.c.d.e.f || {};
a.b.c.d.e.f.g = "some value";
当然有更好的方法来做到这一点吗?
解决方案
最简单的方法是使用字符串,在点上拆分,然后循环。当您循环时,您检查它是否存在,如果存在,则使用它。如果没有,则创建一个新对象。你这样做,直到你设置值的最后。
const setValue = (obj, path, value) => {
path.split('.') // split on the dots
.reduce((o, k, i, a) => {
o[k] = (i + 1 === a.length) // check if we are at last index
? value // if last index use the value
: (o[k] || {}) // else return object or set new one
return o[k] // return the current step in the object
}, obj) // start location
}
setValue(window, 'a.b.c.d.e.f.g', 'some value')
console.log(a.b.c.d.e.f.g)
var foo = { a : { b: {z : {} } } }
setValue(foo, 'a.b.c.d.e.f.g', 'another value')
console.log(foo)
推荐阅读
- linux - 如何获取放置在容器中的文件,该文件可以通过“dsh”从 azure vm 登录?
- python - 从两个日期和频率获取日期范围列表
- jquery - jQuery + CSS中动画字母的问题
- python - keras 将模型权重保存到一个文件中
- c# - DGV 中以编程方式选中的复选框未显示为选中状态
- r - R绘图表的条件格式
- c# - XML 元素值作为字符串写入给出 IO 错误 C#
- mysql - 通过proxysql的mysql用户连接问题
- azure-api-management - 如何对通过 APIM 的请求禁用 gzip 压缩?
- apache - htaccess 身份验证通过。名称