缩小到对象路径

时间:2019-05-01 02:39:49

标签: javascript arrays reduce

我需要一个函数来设置嵌套对象属性的值。对象路径是一个数组,我似乎无法弄清楚如何缩小数组,以便它正确映射到对象。

这就是我所拥有的:

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 个答案:

答案 0 :(得分:2)

要实际设置一个值,您将要使用除最后一个路径元素以外的所有元素进行导航,并为实际值分配保存最后一个。

在化简器中,应将累加器初始化为顶级对象,并在运行时返回每个匹配的对象,以便最终的返回值是最里面的对象。

例如

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)