创造性地动态生成 javascript 个对象
Creative way to dynamically generate javascript objects
我正在使用 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 || {};
const props = ['b', 'c', 'd', 'e', 'f'];
const lastProp = 'g';
const lastObj = props.reduce((a, prop) => {
if (!a[prop]) a[prop] = {};
return a[prop];
}, a);
lastObj[lastProp] = 'some value';
console.log(a);
最简单的方法是使用字符串,按点拆分,然后循环。当你循环时,你检查它是否存在,如果存在,你就使用它。如果不是,则创建一个新对象。你这样做直到你到达你设置值的结尾。
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)
我正在使用 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 || {};
const props = ['b', 'c', 'd', 'e', 'f'];
const lastProp = 'g';
const lastObj = props.reduce((a, prop) => {
if (!a[prop]) a[prop] = {};
return a[prop];
}, a);
lastObj[lastProp] = 'some value';
console.log(a);
最简单的方法是使用字符串,按点拆分,然后循环。当你循环时,你检查它是否存在,如果存在,你就使用它。如果不是,则创建一个新对象。你这样做直到你到达你设置值的结尾。
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)