Переформатировать существующий JSON в новый JSON, используя Javascript / Typescript - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время у меня есть существующий JSON, который я хочу изменить / переформатировать в новый JSON, чтобы его можно было использовать во внешней службе. Формат немного сложен, но я не могу его изменить, поэтому мне нужно отредактировать свой существующий JSON. чтобы соответствовать желаемому результату.

Существующий JSON:

{
    "specifiers": [{
        "value": "test",
        "type": "text",
        "label": "Brand ID"
    }, {
        "value": "test",
        "type": "text",
        "label": "Program ID"
    }]
}

Желаемый выход:


{
    "specifiers": {
        "Brand ID": {
            "text": {
                "value": "test",
                "type": "text"
            }
        },

        "Program ID": {
            "text": {
                "value": "test",
                "type": "text"
            }
        }
    }
}

Я пробовал перебирать существующий JSON с использованием циклов, но я не знаю, как отформатировать циклы, чтобы использовать значения в качестве ключей? Я предполагаю, что мне, возможно, придется использовать Object.keys или Object.values, но я не уверен, как получить конкретное значение для определенного ключа.

Пример формата:

        "[label]": {
            "[type]": {
                "value": [value],
                "type": [type]
            }
        }

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

function tranform({specifiers}) {
  return { specifiers: specifiers.reduce((obj, {label, type, value}) => ({...obj, [label]: { [type]: { type, value } } }), {}) }
}

const json = {
    "specifiers": [{
        "value": "test",
        "type": "text",
        "label": "Brand ID"
    }, {
        "value": "test",
        "type": "text",
        "label": "Program ID"
    }]
}

console.log(tranform(json))
0 голосов
/ 13 марта 2019

вы можете использовать # Array.reduce.фрагмент ниже.

let input = {
  "specifiers": [{
    "value": "test",
    "type": "text",
    "label": "Brand ID"
  }, {
    "value": "test",
    "type": "text",
    "label": "Program ID"
  }]
}
const res = input.specifiers.reduce((res, obj) => {
  const {
    label,
    type,
    value
  } = obj
  res[label] = {};
  res[label][type] = {
    value,
    type
  };
  return res;
}, {});
console.log(res);
0 голосов
/ 13 марта 2019

Довольно просто с уменьшением :

const formattedSpecifiers = existingJSON.specifiers.reduce((newSpecifiers, specifier) => {
  newSpecifiers[specifier.label] = {
      [specifier.type]: {
        type: specifier.type,
        value: specifier.value,
      },
    };
  };

  return newSpecifiers;
}, {});

const newJSON = { specifiers: formattedSpecifiers };
...