【问题标题】:How to restructure json objects with JavaScript如何用 JavaScript 重构 json 对象
【发布时间】:2019-09-24 14:05:58
【问题描述】:

我需要重构 API 调用的输出,它返回的数据类似于:

{
  "Label3":
    [
      { "name": "superman", "power": 8900 },
      { "name": "iron man", "power": 3000 },
      { "name": "spike spiegal", "power": 200 },
      { "name": "doctor strange", "power": 800 }
    ],
  "Label18":
    [
      { "name": "goku", "power": 9000 },
      { "name": "vegeta", "power": 8500 },
      { "name": "pringles can", "power": 1 }
    ],
  "Label37":
    [
      { "name": "dr manhattan", "power": 100000 },
      { "name": "mayonaise", "power": 10 }
    ]
}

我需要它从每个数组中获取最大值,并创建一个新属性,例如称为 maxPower,并进行一些重组以返回如下数据:

{
    "groupName": 'Label3',
    "highestPower": 8900,
    "heroes": [
        {"name":"superman","power":8900},
        {"name":"iron man","power":3000},
        {"name":"spike spiegal","power":200},
        {"name":"doctor strange","power":800}
    ],
},
{
    "groupName": 'Label18',
    "highestPower": 9000,
    "heroes": [
        {"name":"goku","power":9000},
        {"name":"vegeta","power":8500},
        {"name":"pringles can","power":1}
    ],
},
{
    "groupName": 'Label37',
    "highestPower": 100000,
    "heroes": [
        {"name":"dr manhattan","power":100000},
        {"name":"mayonaise","power":10}
    ],
}

我正在考虑对每个数组执行一个 forEach 并获取第二个索引并设置为一个变量并进行比较,只是不知道如何通过数据重组来实现这一点。

【问题讨论】:

  • 请添加您的尝试。

标签: javascript arrays json algorithm sorting


【解决方案1】:

您无法获取条目并构建具有所需属性的新对象。

var data = { Label3: [{ name: "superman", power: 8900 }, { name: "iron man", power: 3000 }, { name: "spike spiegal", power: 200 }, { name: "doctor strange", power: 800 }], Label18: [{ name: "goku", power: 9000 }, { name: "vegeta", power: 8500 }, { name: "pringles can", power: 1 }], Label37: [{ name: "dr manhattan", power: 100000 }, { name: "mayonaise", power: 10 }] },
    result = Object
        .entries(data)
        .map(([groupName, heroes]) => ({
            groupName,
            highestPower: heroes.reduce((max, { power }) => Math.max(max, power), -Infinity),
            heroes
        }));

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

【讨论】:

  • 只是想明白,能否请您告诉我reduce方法中-Infinity的用途
  • @Mr.Learner 对于找到最大值来说,这是一个非常小的起始值。
【解决方案2】:

您可以使用Object.keys() 迭代标签和Array.reduce 以获得最高功率,如下所示:

var labels = {
  "Label3":
    [
      { "name": "superman", "power": 8900 },
      { "name": "iron man", "power": 3000 },
      { "name": "spike spiegal", "power": 200 },
      { "name": "doctor strange", "power": 800 }
    ],
  "Label18":
    [
      { "name": "goku", "power": 9000 },
      { "name": "vegeta", "power": 8500 },
      { "name": "pringles can", "power": 1 }
    ],
  "Label37":
    [
      { "name": "dr manhattan", "power": 100000 },
      { "name": "mayonaise", "power": 10 }
    ]
}

var groupedLabels = Object.keys(labels).map((key) => {
  return {
    groupName: key,
    highestPower: labels[key].reduce(( acc, cur ) => Math.max( acc, cur.power ), 0),
    heroes: labels[key]
  }
});

console.log(groupedLabels);

【讨论】:

    【解决方案3】:

    如果源已排序:

    var src = obj();
    var dst = [];
    for(var i in src) {
        dst.push({
            "groupName":i,
            "highestPower":src[i][0].power,
            "heros":src[i]
        });
    }
    console.log( JSON.stringify(dst,null,2) );
    
    function obj() {
        return {
        "Label3":
          [
            { "name": "superman", "power": 8900 },
            { "name": "iron man", "power": 3000 },
            { "name": "spike spiegal", "power": 200 },
            { "name": "doctor strange", "power": 800 }
          ],
        "Label18":
          [
            { "name": "goku", "power": 9000 },
            { "name": "vegeta", "power": 8500 },
            { "name": "pringles can", "power": 1 }
          ],
        "Label37":
          [
            { "name": "dr manhattan", "power": 100000 },
            { "name": "mayonaise", "power": 10 }
          ]
      };
    }

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2014-01-15
      • 2017-11-17
      • 2021-12-14
      • 2018-12-01
      • 2013-11-28
      相关资源
      最近更新 更多