如何使用跟踪字符串修改嵌套的json位置

时间:2019-03-28 10:54:15

标签: javascript json

我正在创建一个Web应用程序以执行json构建器。问题是我在javascript中有json,并且我有一个要更改元素位置的字符串。

对我来说,很容易访问它以进行循环,但是目标是更新或删除字段或数组。

我找到的唯一成功的解决方案是,这是一个可能的跟踪阵列长度被拆分的开关。

Json示例:

{
    "name" : "Marcelino"
    "id" : "${id}"
    "poderes":
    {
        "poder1" : "volar"
        "poder2" : "echar fuego"
        "poder3" : "${poder4}"
        "array":
        {
             "Elemento1" : "adada"
        }
    } 
}

我要修改以下key:value对:

"poderes" : "volar" 

我在变量中包含了踪迹:

trace = poderes-poder1

当前解决方案

...
let traceArray = trace.split("-");
...
switch(traceArray.length){
...
case1:
    json[traceArray[0]]
...
case2:
    json[traceArray[0]][traceArray[1]]
...
case3:
    json[traceArray[0]][traceArray[1]][traceArray[2]]
...

寻找更好的解决方案。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以通过保存最后一个键来减少路径,然后更改值或删除此属性。

function change(object, path, value) {
    var keys = path.split('-'),
        last = keys.pop(),
        reference = keys.reduce((o, k) => o[k], object);
        
    if (value === DELETE) {
        delete reference[last];
    } else {
        reference[last] = value;
    }
}

const DELETE = Symbol('delete this property');

var data = { name: "Marcelino", id: "${id}", poderes: { poder1: "volar", poder2: "echar fuego", poder3: "${poder4}", array: { Elemento1: "adada" } } },
    target = 'poderes-poder1';
    
change(data, target, 'foo')
console.log(data);

change(data, target, DELETE);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

我认为您可以解决此问题的最好方法是将JSON读取到Javascript对象中,对其进行变异,然后将其转换回JSON:

const hero = JSON.parse(yourJsonString);

hero.poderes.poder1 = "invisibility";

const outputJson = JSON.strigify(hero);