Изменить JSON-структуру глубоко вложенного объекта - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь изменить глубоко вложенный объект JSON из одной структуры в другую.Чтобы иметь возможность использовать его в правильном формате для работы с библиотекой jQuery Nestable.

У меня есть исходный формат:

  {
      "scanned": {
          "a3": {
              "value": 906
          },
          "value": 23667
      },
      "total": {
          "printed": {
              "black": {
                  "value": 44
              },
              "color": {
                  "value": 57
              },
              "value": 101
          },
          "value": 101
      }
  }

Требуемый формат JSON для работыс библиотекой это:

[{
    "id": "scanned: 23667",
    "children": [{
        "id": "a3: 906"
    }]
}, {
    "id": "total: 101",
    "children": [{
        "id": "printed: 101",
        "children": [{
            "id": "black: 44"
        }, {
            "id": "color: 57"
        }]
    }]
}]

Я пытался обойти это дерево с помощью рекурсивной функции, но до сих пор не достиг желаемого результата:

  Object.keys(o).forEach(function (k) {
      if (o[k] !== null && typeof o[k] === 'object') {
          if(parent) {
            console.log(parent);
            if(!o.children) {
              o.children = [];
            }
            o.children.push({id: k + ": " + o[k].value})
          } else {
            o.id = k + ": " + o[k].value
          }

          _this.iter(o[k], k);
          return;
      }
  });

Может кто-нибудь, пожалуйста, предоставьте мнерабочий пример?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Это работает:

var a =  {"total":{"printed":{"black":{"value":44},"color":{"value":57},"value":101},"value":101}};
  
function changeFormat(currObj, parent) {
  if (typeof (parent) == 'object') {
    Object.keys(parent).map((key) => {
      if (key != 'value') {
        var obj = {}
        obj['id'] = key + ": " + parent[key].value


        if (typeof (parent[key]) == 'object' && Object.keys(parent[key]).length > 1) {
          obj['children'] = [];
          changeFormat(obj['children'], parent[key])
        }
        currObj.push(obj);
      }
    })
  }
}

var result = [];

changeFormat(result, a);
console.log(result);
0 голосов
/ 10 октября 2018

Попробуйте следовать

let obj = {"total":{"printed":{"black":{"value":44},"color":{"value":57},"value":101},"value":101}};
  
/* Rest parameters where other other keys are collected in rest object */
function processObj({value, ...rest}, r=[]) {
  /* Iterate over each key/value pair in rest object */
  Object.entries(rest).forEach(([k,v], i) => {
    if(Array.isArray(r)) { // For first level items
      r[i] = {"id" : `${k}: ${v.value}`};
      processObj(v, r[i]);
    } else { // For child nodes
      r.children = r.children || [];
      r.children[i] = {"id" : `${k}: ${v.value}`};
      processObj(v, r.children[i]);

    }
  });
  return r;
}
  
console.log(processObj(obj))
...