使用 javascript 将 JSON 转换为不同的格式

Convert JSON to different format using the javascript

我有 JSON 请看下面,我需要帮助来转换下面提到的格式。我想将数据移动到不同的列(格式如下)

JSON 我有

const data =
[
    {
        "2":{
            "value":1.2
        },
        "3":{
            "values":{
                "10.0":1.3
            }
        },
        "4":{
            "value":1.6
        },
        "key":"abc",
        "count":2
    },
    {
        "2":{
            "value":2.2
        },
        "3":{
            "values":{
                "10.0":1.2
            }
        },
        "4":{
            "value":5.6
        },
        "key":"xyz",
        "count":22
    },
    
]

我想把上面的格式改成下面的格式:

预期格式

const data =
[
    {
        col1: "1.2",
        col2: "1.3",
        col3: "1.6",
        col4: "abc",
        col5: "2"
    },
    {
        col1: "2.2",
        col2: "1.2",
        col3: "5.6",
        col4: "xyz",
        col5: "22"
    },
    
]

我相信这就是您要找的。

我假设只有 valuevalues 属性,而在 values 中您只需要第一个。如果我的假设是正确的,下面是您的代码片段。

const data = [
  {
    '2': {
      value: 1.2,
    },
    '3': {
      values: {
        '10.0': 1.3,
      },
    },
    '4': {
      value: 1.6,
    },
  },
  {
    '2': {
      value: 2.2,
    },
    '3': {
      values: {
        '10.0': 1.2,
      },
    },
    '4': {
      value: 5.6,
    },
  },
];

const result = data.map((item) => {
  return Object.values(item)
    .reduce((acc, { value = null, values = null }, index) => {
      if (value) return { ...acc, [`col${index + 1}`]: String(value) };
      if (values) {
        const [firstItem = null] = Object.values(values);
        if (firstItem) return { ...acc, [`col${index + 1}`]: String(firstItem) };
      }
    }, {});
});

console.log(result);

这里有一个解决方案,可以将任意嵌套的 json 输入展平,假设每一列只有一个原始值。它利用了 js 中的数组实际上只是带有数字键的对象这一事实。

const data = [
  {
    '2': { value: 1.2, },
    '3': { values: { '10.0': 1.3, }, },
    '4': { value: 1.6, },
  },
  {
    '2': { value: 2.2, },
    '3': { values: { '10.0': 1.2, }, },
    '4': { value: 5.6, },
  },
];

const flattenedValue = value => {
  while (typeof value == 'object' && value != null) 
    for (const v of Object.values(value)) 
      value = v; 
  return value;
};
const result = data.map(row => 
  Object.fromEntries(
    Object.values(row).map(flattenedValue).map((v, i) => [`col${i + 1}`, v])
  )
);

console.log(result);