【问题标题】:Creative way to dynamically generate javascript objects动态生成 javascript 对象的创造性方法
【发布时间】:2019-06-25 12:11:12
【问题描述】:

我正在使用 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";

肯定有更好的方法来做到这一点吗?

【问题讨论】:

  • 你可以写一个函数,叫做set(a, ["b", "c", "d", ...], "some value");
  • “我不知道是否所有这些对象都已创建”是什么意思?是需要创建数据结构还是遍历已有的数据结构?
  • 这是一个设置树,其中 a 是设置的全局列表。在我的具体情况下,假设 a.b.c.d.x 已经设置,那么我需要创建 e 和 f 对象,并添加 g 属性而不搞砸它上面的任何东西。
  • 现有对象数据结构是{"a":{"b":{"c":{"d":{}}}}}吗?

标签: javascript function helper


【解决方案1】:

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

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)

【讨论】:

  • 非常感谢。你刚刚为我清理了 1000 行代码!
【解决方案2】:

我会使用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);

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 2018-05-20
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多