JavaScript设置路径指向的JSON元素

JavaScript设置路径指向的JSON元素,javascript,Javascript,我希望有一个函数可以修改JSON对象中的值。该值由路径指定,如本例所示: setConfigItem(['node1','nodeA','value1A'], 1234); 目前我正在使用以下功能: var setConfigItem = function(path, value) { if (path.length == 1) config[path[0]] = value; if (path.length == 2) config[path[

我希望有一个函数可以修改JSON对象中的值。该值由路径指定,如本例所示:

setConfigItem(['node1','nodeA','value1A'], 1234);
目前我正在使用以下功能:

var setConfigItem = function(path, value) {
    if (path.length == 1)
        config[path[0]] = value;
    if (path.length == 2)
        config[path[0]][path[1]] = value;
    if (path.length == 3)
        config[path[0]][path[1]][path[2]] = value;

    // ...

    throw {name : "NotImplementedError", message : "too lazy to implement more"}; 
}
什么是更好的通用解决方案?

您可以使用Arrayreduce使用path数组动态设置值

Reduce将数组折叠为一个值,我们将使用对象植入Reduce函数,因此每次迭代我们都返回currentObject[key],直到我们到达所需的键并在其中设置值

常量配置={ 节点1:{ 诺迪亚:{ 价值1A:4657 } } } const setConfigItem=路径、值、对象=>{ //减少路径数组,每次迭代都深入挖掘对象属性 path.reduceacumerator,key,i=>{ //如果处于最后一个关键点,请设置该值 如果i==path.length-1{ 累加器[键]=值 回流蓄能器 } //测试以查看是否存在属性 如果累加器的类型[键]=“未定义”{ 抛出新错误“此处无需查看” } //返回下一级 返回累加器[键] },obj //返回原始对象 返回obj } console.log'before',config setConfigItem['node1','nodeA','value1A',1234,配置 console.log'after',config 期望“用值替换给定对象”,=>{ 常量obj={a:1} assertsetConfigItem['a'],2,对象deepEqual{a:2} assertsetConfigItem['a'],2,对象 } 可以使用Arrayreduce使用路径数组动态设置值

Reduce将数组折叠为一个值,我们将使用对象植入Reduce函数,因此每次迭代我们都返回currentObject[key],直到我们到达所需的键并在其中设置值

常量配置={ 节点1:{ 诺迪亚:{ 价值1A:4657 } } } const setConfigItem=路径、值、对象=>{ //减少路径数组,每次迭代都深入挖掘对象属性 path.reduceacumerator,key,i=>{ //如果处于最后一个关键点,请设置该值 如果i==path.length-1{ 累加器[键]=值 回流蓄能器 } //测试以查看是否存在属性 如果累加器的类型[键]=“未定义”{ 抛出新错误“此处无需查看” } //返回下一级 返回累加器[键] },obj //返回原始对象 返回obj } console.log'before',config setConfigItem['node1','nodeA','value1A',1234,配置 console.log'after',config 期望“用值替换给定对象”,=>{ 常量obj={a:1} assertsetConfigItem['a'],2,对象deepEqual{a:2} assertsetConfigItem['a'],2,对象 }
一个简单的强制性解决方案:

常量obj={a:{b:{c:1}} 函数UpdateObject、路径、值{ 设o=对象; forvar i=0;iconsole.logobj 一个简单的强制性解决方案:

常量obj={a:{b:{c:1}} 函数UpdateObject、路径、值{ 设o=对象; forvar i=0;i 让对象={a:{b:{c:1}}; _.setobject,['a','b','c'],5; console.logobject; 您可以从Lodash使用:

让对象={a:{b:{c:1}}; _.setobject,['a','b','c'],5; console.logobject;
简单递归解

var config={node1:{nodeA:{value1A:0}}; 函数setConfigItemconfig、路径、值{ 如果path.length==1{ 配置[路径[0]]=值; }否则{ setConfigItemconfig[path[0]],path.slice1,值; } } setConfigItemconfig,['node1','nodeA','value1A',1234;
console.logconfig 简单递归解

var config={node1:{nodeA:{value1A:0}}; 函数setConfigItemconfig、路径、值{ 如果path.length==1{ 配置[路径[0]]=值; }否则{ setConfigItemconfig[path[0]],path.slice1,值; } } setConfigItemconfig,['node1','nodeA','value1A',1234;
console.logconfig;所有的问题都很好,但我选择你的作为最优雅的一个。我喜欢迭代法所有的问题都很好,但我选择了你的作为最优雅的一个。我喜欢迭代法,我非常喜欢你的解决方案。我将其用于读取而不是设置,因为它允许将其修改为单行:path.reducenode,key=>node[key],object。对于设置,我使用了迭代方法。我非常喜欢您的解决方案。我将其用于读取而不是设置,因为它允许将其修改为单行:path.reducenode,key=>node[key],object。对于设置,我使用了迭代的方法。这应该是可以接受的答案,但您可能应该切片路径数组,而不是移动值,因为您将对提供的数组进行变异。T his应该是可接受的答案,但您可能应该切分路径数组,而不是移动值,因为您将对提供的数组进行变异。