Добавьте пару ключ-значение, скопировав значение указанного ключа c в javascript во вложенной структуре json - PullRequest
1 голос
/ 27 апреля 2020

У меня есть вложенная структура json, как показано ниже

const data = {
  "name": "A",
  "invalid": {
      "distinctCountOnColumns": [
        {
          "key": "some_key",
          "value": 101557856
        }
      ],
      "groupByAndCountOnColumns": [
        [
          {
            "key": "some_key",
            "value": "no data",
            "count": 101557856
          }
        ],
      ]
  },
  "children": [
    {
      "name": "B",
      "count": 1654164,
      "children": [
        {
          "name": "B1",
          "count": 16564,
        },
        {
          "name": "B2",
          "count": 165411,
        }
      ]
    },
    {
      "name": "C",
      "count": 15135
    }
  ]
}

Я хочу добавить ключ с именем значение рядом с ключом count , скопировав значение ключа count . Но ключ count внутри объекта invalid не должен рассматриваться. Результирующие данные приведены ниже

const resultData = {
  "name": "A",
  "invalid": {
      "distinctCountOnColumns": [
        {
          "key": "some_key",
          "count": 192869,
          "value": 101557856
        }
      ],
      "groupByAndCountOnColumns": [
        [
          {
            "key": "some_key",
            "value": "no data",
            "count": 101557856
          }
        ],
      ]
  },
  "children": [
    {
      "name": "B",
      "count": 1654164,
      "value": 1654164,
      "children": [
        {
          "name": "B1",
          "count": 16564,
          "value": 16564
        },
        {
          "name": "B2",
          "count": 165411,
          "value": 165411
        }
      ]
    },
    {
      "name": "C",
      "count": 15135,
      "value": 15135
    }
  ]
}

Я пробовал этот метод, но ключ значение не добавляется рядом с ключом count .

const deepCopy = (arr) => {
          let copy = [];
          arr.forEach(elem => {
            if(Array.isArray(elem)){
              copy.push(deepCopy(elem))
            }else{
              if (typeof elem === 'object') {
                copy.push(deepCopyObject(elem))
            } else {
                copy.push(elem)
              }
            }
          })
          return copy;
        };
        const deepCopyObject = (obj) => {
          let tempObj = {};
          for (let [key, value] of Object.entries(obj)) {

            if(key !== "invalid" && key === "count"){
                obj.value = obj[key];
             }
            if (Array.isArray(value)) {
              tempObj[key] = deepCopy(value);
            } else {
              if (typeof value === 'object') {
                tempObj[key] = deepCopyObject(value);
              } else {
                tempObj[key] = value
              }
            }
          }
          return tempObj;
        };
const resultData = deepCopyObject(data);
console.log("result", data)

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете создать рекурсивную функцию, которая будет принимать данные и добавлять старый и новый ключи. Он также проверяет, есть ли у некоторых из родительских элементов значение ключа invalid, игнорируя этот объект и его дочерние элементы.

const data = {"name":"A","invalid":{"distinctCountOnColumns":[{"key":"some_key","value":101557856}],"groupByAndCountOnColumns":[[{"key":"some_key","value":"no data","count":101557856}]]},"children":[{"name":"B","count":1654164,"children":[{"name":"B1","count":16564},{"name":"B2","count":165411}]},{"name":"C","count":15135}]}

function update(data, oldKey, newKey, isValid = true) {
  if (oldKey in data && isValid) {
    data[newKey] = data[oldKey]
  }

  for (let i in data) {
    if (isValid) {
      if (typeof data[i] == 'object') {
        update(data[i], oldKey, newKey, isValid && i !== 'invalid')
      }
    }
  }
}

update(data, 'count', 'value')
console.log(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...