Как заменить все значения в структуре JSON, используя JavaScript? - PullRequest
0 голосов
/ 19 февраля 2019

Если у меня есть такая структура JSON, я хочу проанализировать этот JSON, заменив все значения на «{param.keyName}», если значение ключа является массивом объектов, чем необходимо сгенерировать его значение, например {param.headKey [index] keyName}

{
          "resources": [
            {
              "name": "prod",
              "type": "local",
              "properties": {
                "zone": "asia",
                "disks": [
                  {
                    "sizeGb": 3,
                    "diskType": "boot",
                    "name": "backup"
                  },
                  {
                    "sizeGb": 4,
                    "diskType": "ssd",
                    "name": "cache"
                  }
                ]
              }
            }
          ]
        }

Вывод функции должен быть в формате JSON, где все значения должны быть заменены отображением.Если существует какой-либо массив объектов, он должен начинаться с индекса массива, например {param.disks0_name}, где дисков - это массив объектов.

{
  "resources": [
    {
      "name": "prod",
      "type": "local",
      "properties": {
        "zone": "{param.zone}",
        "disks": [
          {
            "sizeGb": '{param.disks0_sizeGb}',
            "diskType": '{param.disks0_diskType}',
            "name": "{param.disks0_name}"
          },
          {
            "sizeGb": '{param.disks1_zone}',
            "diskType": '{param.disks1_diskType}',
            "name": "{param.disks1_name}"
          }
        ]
      }
    }
  ]
}

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете искать массивы / объекты и повторять их для получения пути к последнему свойству.

Форматировать по желанию (что непонятно для вложенных массивов).

function formatPath(path) {
    return `{${path.join('.')}}`;
}

function getPath(object, path = []) {
    return Object.assign(
        Array.isArray(object) ? [] : {},
        ...Object.entries(object).map(([k, v]) => ({
            [k]: v && typeof v === 'object'
                ? getPath(v, path.concat(k))
                : formatPath(path.concat(k))
        }))
    );
}

var data = { resources: [{ name: "prod", type: "local", properties: { zone: "asia", disks: [{ sizeGb: 3, diskType: "boot", name: "backup" }, { sizeGb: 4, diskType: "ssd", name: "cache" }] } }] };

data = { resources: data.resources.map(o => Object.assign({}, o, { properties: getPath(o.properties, ['param']) })) };

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

ES5

function formatPath(path) {
    return '{' + path.join('.') + '}';
}

function getPath(object, path) {
    path = path || [];
    return Object.keys(object).reduce(
        function (r, k) {
            r[k] = object[k] && typeof object[k] === 'object'
                ? getPath(object[k], path.concat(k))
                : formatPath(path.concat(k));
            return r;
        }, 
        Array.isArray(object) ? [] : {}
    );
}

var data = { resources: [{ name: "prod", type: "local", properties: { zone: "asia", disks: [{ sizeGb: 3, diskType: "boot", name: "backup" }, { sizeGb: 4, diskType: "ssd", name: "cache" }] } }] };

data = { resources: data.resources.map(function (o) { 
    return Object.keys(o).reduce(function (r, k) {
        r[k] = k === 'properties'
            ? getPath(o.properties, ['param'])
            : o[k];
        return r;
    }, {});
 }) };

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...