Творческий способ динамически генерировать объекты JavaScript - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю с объектом 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";

Конечно, есть лучший способ сделать это правильно?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Самый простой способ - использовать строку, разбить на точки и зациклить.Когда вы зацикливаетесь, вы проверяете, существует ли оно, если оно есть, вы используете его.Если это не так, то вы создаете новый объект.Вы делаете это, пока не дойдете до конца, где вы установите значение.

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)
0 голосов
/ 01 февраля 2019

Я бы использовал 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...