动态修改字符串的 json 属性
Modify json properties from string dynamically
我有JSON个对象
var a = { a: { b: 10, c: 10 } }
我想要一个可以动态改变 JSON 对象的方法。假设当我向方法提供对象、字符串和值时,它应该 return 更新 JSON 对象
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 }
}
应该return
{ a: { b : 30, c: 10 } }
无需修改其他 json 字段,但目前正在 returning
{ a: { b : 30 } }
你的 return 语句将用 {b:30} 覆盖键 {b: 10, c:10} 的值,你得到的,你可以使用 lodash 库的 ``set` `` 功能与您尝试实现的功能相同
您可以使用以下代码更改值
var a = { a: { b: 10, c: 10 } }
function getObj(obj, key) {
return obj[key];
}
function change(obj, keys, value) {
let newObj = JSON.parse(JSON.stringify(obj));
let str = keys.split('.');
str.reduce( (acc, curr, index) => {
if(index === str.length -1) {
acc[curr]= value;
return acc
}else {
return getObj(acc, curr);
}
}, newObj );
return newObj;
}
console.log(change(a, 'a.b', 30))
console.log(change(a, 'a.c', 20))
这是一种方法:
var a = { a: { b: 10, c: 10 } };
var b = { a: { b: { c: 10 } } };
function change(obj, str, val) {
// get parts of the string as an array
const prop = str.split('.');
// deep clone the object (so you don't modify the original 'a' object, insted you get a new one returned)
const newObj = {...obj};
// save a reference to the new object
let target = newObj;
prop.forEach((el, i) => {
if(i < prop.length-1) {
// replace the reference for a nested reference
target = target[el];
} else {
// if it's the last 'prop' item, change the value
target[el] = val;
}
});
// return the new object
return newObj;
}
console.log(change(a, 'a.b', 30));
console.log(change(b, 'a.b.c', 50));
我有JSON个对象
var a = { a: { b: 10, c: 10 } }
我想要一个可以动态改变 JSON 对象的方法。假设当我向方法提供对象、字符串和值时,它应该 return 更新 JSON 对象
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 }
}
应该return
{ a: { b : 30, c: 10 } }
无需修改其他 json 字段,但目前正在 returning
{ a: { b : 30 } }
你的 return 语句将用 {b:30} 覆盖键 {b: 10, c:10} 的值,你得到的,你可以使用 lodash 库的 ``set` `` 功能与您尝试实现的功能相同
您可以使用以下代码更改值
var a = { a: { b: 10, c: 10 } }
function getObj(obj, key) {
return obj[key];
}
function change(obj, keys, value) {
let newObj = JSON.parse(JSON.stringify(obj));
let str = keys.split('.');
str.reduce( (acc, curr, index) => {
if(index === str.length -1) {
acc[curr]= value;
return acc
}else {
return getObj(acc, curr);
}
}, newObj );
return newObj;
}
console.log(change(a, 'a.b', 30))
console.log(change(a, 'a.c', 20))
这是一种方法:
var a = { a: { b: 10, c: 10 } };
var b = { a: { b: { c: 10 } } };
function change(obj, str, val) {
// get parts of the string as an array
const prop = str.split('.');
// deep clone the object (so you don't modify the original 'a' object, insted you get a new one returned)
const newObj = {...obj};
// save a reference to the new object
let target = newObj;
prop.forEach((el, i) => {
if(i < prop.length-1) {
// replace the reference for a nested reference
target = target[el];
} else {
// if it's the last 'prop' item, change the value
target[el] = val;
}
});
// return the new object
return newObj;
}
console.log(change(a, 'a.b', 30));
console.log(change(b, 'a.b.c', 50));