使用 Javascript/Typescript 将现有的 JSON 重新格式化为新的 JSON

Reformat Existing JSON into new JSON using Javascript/Typescript

我目前有一个现有的 JSON,我想 change/reformat 到一个新的 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]
            }
        }

非常简单 reduce:

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

  return newSpecifiers;
}, {});

const newJSON = { specifiers: formattedSpecifiers };

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))

你可以使用#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);