Javascript 动态修改字符串中的json属性

Javascript 动态修改字符串中的json属性,javascript,json,mapreduce,object-properties,Javascript,Json,Mapreduce,Object Properties,我有一个JSON对象 var a = { a: { b: 10, c: 10 } } change(a, 'a.b', 30) 我想要一个可以动态更改JSON对象的方法。假设当我向方法提供对象、字符串和值时,它应该返回更新的JSON对象 var a = { a: { b: 10, c: 10 } } change(a, 'a.b', 30) 更改方法如下:- function change(obj, str, val) { const newObject = str.spli

我有一个JSON对象

var a = { a: { b: 10, c: 10 } } 
change(a, 'a.b', 30) 
我想要一个可以动态更改JSON对象的方法。假设当我向方法提供对象、字符串和值时,它应该返回更新的JSON对象

var a = { a: { b: 10, c: 10 } } 
change(a, 'a.b', 30) 
更改方法如下:-

function change(obj, str, val) {
  const newObject = str.split('.').reverse()
      .reduce((a,p,i) => { 
          if(i===0) a[p] = val 
          else { let b = {}; b[p] = a; a = b} 
          return a;
       },{})
   return {  ...obj, ...newObject } 
}
它应该会回来

{ a: { b : 30, c: 10 } } 
不修改其他json字段,但当前正在返回

 { a: { b : 30 } } 

您的return语句将用{b:30}覆盖键{b:10,c:10}的值,您可以使用lodash库的``set``函数,该函数执行与您尝试实现的相同的操作

您可以使用以下代码更改该值

var a={a:{b:10,c:10}
函数getObj(obj,键){
返回obj[键];
}
功能更改(对象、键、值){
让newObj=JSON.parse(JSON.stringify(obj));
设str=keys.split('.');
str.reduce((会计科目、当前、索引)=>{
如果(索引===str.length-1){
acc[当前]=值;
返回acc
}否则{
返回getObj(acc,curr);
}
},newObj);
返回newObj;
}
控制台日志(更改(a'a.b',30))

log(更改(a,'a.c',20))
这是一种方法:

vara={a:{b:10,c:10};
var b={a:{b:{c:10}};
功能更改(obj、str、val){
//获取字符串的部分作为数组
const prop=str.split('.');
//深度克隆对象(这样您就不会修改原始的“a”对象,而是返回一个新对象)
const newObj={…obj};
//保存对新对象的引用
设target=newObj;
道具forEach((el,i)=>{
如果(i控制台日志(更改(b,'a.b.c',50))字符串可以在将来更改为'a.b.c',因此我希望动态计算它。谢谢你的回答。我更改了代码,使其可以使用任意长度的字符串。我知道这个lodash方法,但我想实现我自己的方法,看看它如何工作