Уменьшить до пути к объекту - PullRequest
3 голосов
/ 01 мая 2019

Мне нужна функция для установки значения для свойства вложенного объекта.Путь к объекту - это массив, который я не могу понять, как его уменьшить, чтобы он правильно отображался на объекте.

Вот что у меня есть:

var store = {
    config: {
        default: {
            value: 'foo' 
        }
    }
};

function setValue({ object, objectPath, value } = {}) {
        properties = objectPath.reduce((acc, prop) => {
            acc[prop];
            return store[acc];
        });
};

setValue({ 
    object: 'config', 
    objectPath: [ 'default', 'value' ],
    value: 'bar'
});

1 Ответ

2 голосов
/ 01 мая 2019

Чтобы фактически установить значение, вам нужно перемещаться, используя все, кроме последнего элемента пути, сохраняя последний для фактического присвоения значения.

В вашем редукторе вы должны инициализировать аккумулятор для объекта верхнего уровня и возвращать каждый соответствующий объект по ходу, чтобы окончательное возвращаемое значение было самым внутренним объектом.

Например

var store = {
    config: {
        default: {
            value: 'foo' 
        }
    }
};

function setValue({ object, objectPath, value } = {}) {
  // create a navigation path using the initial store key "object" and
  // the objectPath minus the last element
  let navigate = [object, ...objectPath.slice(0, -1)]
  
  // reduce to find / create the store[nav0][nav1][nav2]... element
  let valueObj = navigate.reduce((obj, prop) => {
    // create an empty object if required
    if (typeof obj[prop] !== 'object') {
      obj[prop] = Object.create(null)
    }
    return obj[prop]
  }, store)
  
  // set the value
  valueObj[objectPath[objectPath.length - 1]] = value
};

setValue({ 
    object: 'config', 
    objectPath: [ 'default', 'value' ],
    value: 'bar'
});

console.info(store)
...