英文:
javascript update json value by list of keys
问题
我有一个对象,它非常深。例如:
section: {
data: {
x = 4
}
}
真实的情况甚至更加深层。
当我有这样一个函数时,如何更新 x 的值:
const keys = [section, data, x];
const update = (newValue, keys) => {
// 应该是这样的
// myObjc[section][data][x] = newValue;
}
英文:
I have an object which goes so deep. For example:
section: {
data: {
x = 4
}
}
Real one is even more deep.
How can I update the x value when I have such a function:
const keys = [section, data, x];
const update = (newValue, keys) => {
// it should be like this
// myObjc[section][data][x] = newValue;
}
答案1
得分: 1
我认为你需要的是一个深度设定值的函数,就像这样
const update = (newValue, keys, obj) => {
for(const key of keys.slice(0,-1))
obj=obj[key];
obj[keys[keys.length-1]]=newValue
}
英文:
I think what you need is a deep set value function, like this
const update = (newValue, keys, obj) => {
for(const key of keys.slice(0,-1))
obj=obj[key];
obj[keys[keys.length-1]]=newValue
}
答案2
得分: 1
你可以使用递归函数来避免错误。
/**
* 安全地在对象中设置一个键或抛出可预测的错误
* @param obj 一个对象
* @param path 表示路径的字符串数组
* @param value 新值
*/
function safeUpdateObject(obj, path, value){
if(path.length === 0){
throw new Error('无法更新没有路径的对象');
}
if(path.length === 1){
obj[path[0]] = value;
return;
}
if(path.length > 1){
if(typeof obj[path[0]] === 'undefined'){
obj[path[0]] = {};
}
if (typeof obj[path[0]] !== 'undefined' && typeof obj[path[0]] !== "object") {
throw new Error('无法在非对象上设置键值对');
}
let unwrapped = obj[path[0]];
safeUpdateObject(unwrapped, path.slice(1), value);
}
}
英文:
You can use a recursive function to avoid errors
/**
* Safely sets a key in an object or throws a predictable error
* @param obj An object
* @param path An Array of strings representing the path
* @param value The new value
*/
function safeUpdateObject(obj, path, value){
if(path.length === 0){
throw new Error('Cannot update object with no path');
}
if(path.length === 1){
obj[path[0]] = value;
return;
}
if(path.length > 1){
if(typeof obj[path[0]] === 'undefined'){
obj[path[0]] = {};
}
if (typeof obj[path[0]] !== 'undefined' && typeof obj[path[0]] !== "object") {
throw new Error('Cannot set key-value pair on non-object');
}
let unwrapped = obj[path[0]];
safeUpdateObject(unwrapped, path.slice(1), value);
}
}
答案3
得分: 1
const o = {section: {data: { x: 4 }} }
const keys = ['section', 'data', 'x'];
const update = (newValue, keys, obj) => {
const l = keys.reduce((acc, x, i) => {
if (i == keys.length - 1) {
acc[x] = newValue
}
return acc[x]
}, obj)
obj = l
}
update(5, keys, o)
英文:
const o = {section: {data: { x: 4 }} }
const keys = ['section', 'data', 'x'];
const update = (newValue, keys, obj) => {
const l = keys.reduce((acc, x, i) => {
if (i == keys.length - 1) {
acc[x] = newValue
}
return acc[x]
}, obj)
obj = l
}
update(5, keys, o)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论