Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态生成javascript对象的创造性方法_Javascript_Function_Helper - Fatal编程技术网

动态生成javascript对象的创造性方法

动态生成javascript对象的创造性方法,javascript,function,helper,Javascript,Function,Helper,我正在处理一个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

我正在处理一个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";

当然有更好的方法来做到这一点吗?

我会使用
reduce
来迭代除最后一个之外的所有道具,如果需要,在嵌套属性处创建一个对象,并返回嵌套值。然后,在最后一个对象上,指定给最后一个特性:

a=window.a |{};
常量props=['b','c','d','e','f'];
const lastProp='g';
const lastObj=道具减少((a,道具)=>{
如果(!a[prop])a[prop]={};
返回一个[道具];
},a);
lastObj[lastProp]=“某些值”;

控制台日志(a)
我会使用
reduce
迭代除最后一个之外的所有道具,必要时在嵌套属性处创建一个对象,并返回嵌套值。然后,在最后一个对象上,指定给最后一个特性:

a=window.a |{};
常量props=['b','c','d','e','f'];
const lastProp='g';
const lastObj=道具减少((a,道具)=>{
如果(!a[prop])a[prop]={};
返回一个[道具];
},a);
lastObj[lastProp]=“某些值”;

控制台日志(a)最简单的方法是使用字符串、在点上拆分和循环。当您循环时,检查它是否存在,如果存在,则使用它。如果没有,则创建一个新对象。这样做,直到最后设置值为止

const setValue=(对象、路径、值)=>{
path.split('.')//在点上拆分
.减少((o,k,i,a)=>{
o[k]=(i+1==a.length)//检查我们是否在最后一个索引
?值//如果最后一个索引使用该值
:(o[k]|{}//else返回对象或设置新对象
return o[k]//返回对象中的当前步骤
},obj)//开始位置
}
设置值(窗口“a.b.c.d.e.f.g”、“某些值”)
控制台日志(a.b.c.d.e.f.g)
var foo={a:{b:{z:{}}
设置值(foo,“a.b.c.d.e.f.g”,“另一个值”)

log(foo)
最简单的方法是使用字符串,在点上拆分,然后循环。当您循环时,检查它是否存在,如果存在,则使用它。如果没有,则创建一个新对象。这样做,直到最后设置值为止

const setValue=(对象、路径、值)=>{
path.split('.')//在点上拆分
.减少((o,k,i,a)=>{
o[k]=(i+1==a.length)//检查我们是否在最后一个索引
?值//如果最后一个索引使用该值
:(o[k]|{}//else返回对象或设置新对象
return o[k]//返回对象中的当前步骤
},obj)//开始位置
}
设置值(窗口“a.b.c.d.e.f.g”、“某些值”)
控制台日志(a.b.c.d.e.f.g)
var foo={a:{b:{z:{}}
设置值(foo,“a.b.c.d.e.f.g”,“另一个值”)

log(foo)
您可以编写一个名为set(a、[“b”、“c”、“d”、…]、“some value”)的函数你所说的“我不知道是否所有这些对象都已创建”是什么意思?是创建数据结构还是遍历现有数据结构的要求?它是一个设置树,其中a是全局设置列表。在我的具体例子中,假设已经设置了a.b.c.d.x,那么我需要创建e和f对象,并添加g属性,而不在上面加任何东西。是现有的对象数据结构
{“a”:{“b”:{“c”:{“d”:{}}
?您可以编写一个类似
集(a,[“b”,“c”,“d”,“d”,“some value”)的函数你所说的“我不知道是否所有这些对象都已创建”是什么意思?是创建数据结构还是遍历现有数据结构的要求?它是一个设置树,其中a是全局设置列表。在我的具体案例中,假设已经设置了a.b.c.d.x,那么我需要创建e和f对象,并添加g属性,而不在上面做任何修改。现有的对象数据结构是
{“a”:{“b”:{“c”:{“d”:{}}
,真的很感激。你刚刚为我清理了1000行代码!非常感谢。你刚刚为我清理了1000行代码!