我有这个JSON数据对象(示例):
let obj = [
{
test0: [
{testA: 'ContentA' },
{testB: 'ContenB'}
]
}
];
我想动态替换键“ testB”的值。即我需要能够处理对象中的任何项目并替换ist。
到目前为止,这是我正在做的事情:
因此,我以编程方式生成了一个混合的键/索引路径来寻址目标对象,它看起来像这样(以数组形式):
let path = [0,'\'test0\'',1,'\'testB\''];
为了将其放入可执行形式中进行实际替换,我将路径转换为JavaScript代码并使用eval运行它。像这样:
let newText = 'ContentB';
eval(`obj[${path.join('][')}]=\'${newText}\'`);
Eval执行以下代码文字:
obj[0]['test0'][1]['testB'] = 'ContentB'
这行得通,但是如果可能的话,我想知道是否还有一种不使用“ eval”的替代方法。
答案 0 :(得分:2)
您可以使用递归函数,并将属性路径作为属性数组传递给它,如下所示:
function setDeepValue(obj, [prop, ...path], value) {
if (!path.length) {
obj[prop] = value;
} else {
if (!(prop in obj)) obj[prop] = {};
setDeepValue(obj[prop], path, value);
}
}
// Example:
const arr = [{
test0: [
{ testA: 'ContentA' },
{ testB: 'ContenB' }
]
}];
setDeepValue(arr, [0, "test0", 1, "testB"], "ContentB");
console.log(arr);