Как реструктурировать объекты JSON с помощью JavaScript - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно реструктурировать вывод из вызова 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 для каждого массива, получении 2-го индекса и установке переменной, а также проведении сравнения, просто не уверенкак добиться этого с помощью реструктуризации данных.

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

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

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; }
1 голос
/ 24 сентября 2019

Вы можете использовать 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);
1 голос
/ 24 сентября 2019

Если источник отсортирован еще:

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 }
      ]
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...