JavaScript设置路径指向的JSON元素
我希望有一个函数可以修改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[
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;i
简单递归解 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应该是可接受的答案,但您可能应该切分路径数组,而不是移动值,因为您将对提供的数组进行变异。