Изменить значение в JSON с рекурсией - PullRequest
2 голосов
/ 16 апреля 2019

Я пытаюсь изменить значение json с машинописью с помощью рекурсивной функции.Я знаю, как показать все ключи или значения, но я не знаю точно, как изменить значение.

У меня есть этот json и этот код:


var json = {
    "a" : "hello",
    "b" : "bye",
    "c" : {
        "d" : "test1",
        "e" : "test2"
    },
    "f" : {
        "g" : {
             "h" : "test3",
             "i" : "test4"
         }
    }
};

changeInJson(id: string, value: string, level: number, json: object): void {
    level = level || 0;
    for (var property in json) {
        if (typeof json[property] === 'object') {
            this.changeInJson(id, value, ++level, json[property]);
        } else {
            console.log(property);
            if(property === id) {
                //change value in json
                console.log("Yes");
            }
        }
    }
};

changeInJson("i", "changed", 0, json);
console.log(json);

В этом примереЯ знаю ключи json, но на самом деле мне нужно как-то сохранить весь путь, чтобы добраться до ключа «i», и это то, что я не знаю, как это сделать.

Спасибо

1 Ответ

1 голос
/ 16 апреля 2019

Для этой конкретной рекурсивной задачи нет необходимости отслеживать глубину (или уровень) рекурсии, поскольку завершающий рекурсивный случай достигается естественным образом, когда рассматриваемый объект не имеет подобъектов.Здесь следует учесть, что объекты, содержащие циклические ссылки, взрывают рекурсию, если вы не примете специальные меры для отслеживания того, что вы уже видели .

Обобщенный подход к изменению любого объекта / вложенного элемента.prop с именем id будет чем-то похожим на:

const changeInJson = (id: string, value: string, obj: object): void => {
  for (const [k, v] of Object.entries(obj)) {
    if (k === id) {
      obj[k] = value;
    } else if (typeof v === "object") {
      changeInJson(id, value, v);
    }
  }
};

IIRC вам понадобится как минимум es2017 lib в вашем файле tsconfig.json для Object.entries

Iоставлю добавление обработки массива в качестве упражнения для читателя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...