Сделать из одного массива другой с изменением ключей Object.entries

Есть изначальный массив вида:

[
   {
      "id":1287,
      "name":"name1",
      "params":[
         {
            "param1":"10",
            "type":"UInt32"
         },
         {
            "param2":"30",
            "type":"UInt16"
         }
      ]
   },
   {
      "id":1288,
      "name":"name2 ",
      "params":[
         {
            "param3":"20",
            "type":"Date"
         },
         {
            "param4":"34",
            "type":"String"
         },
         {
            "param5":"15",
            "type":"UInt8"
         }
      ]
   }
]

Его надо перевести в массив вида:

[
   {
      "id":1287,
      "name":"name1",
      "params":[
         {
            "name":"name1",
            "key":"param1",
            "value":"10",
            "type":"UInt32"
         },
         {
            "name":"name1",
            "key":"param2",
            "value":"30",
            "type":"UInt32"
         }
      ]
   },
   {
      "id":1288,
      "name":"name2",
      "params":[
         {
            "name":"name2",
            "key":"param3",
            "value":"20",
            "type":"UInt32"
         },
         {
            "name":"name2",
            "key":"param4",
            "value":"34",
            "type":"UInt32"
         },
         {
            "name":"name2",
            "key":"param5",
            "value":"15",
            "type":"UInt32"
         }
      ]
   }
]

Была попытка для переведения "param1": 10 в "key":"param1","value":"10" использовать map и Object.entries, но не получается привести все к нужному виду и добавить в новые объекты внутри params внешний name.

Подскажите, какое решение тут было бы лучше?


Ответы (2 шт):

Автор решения: Qwertiy

var a = [ { "id":1287, "name":"name1", "params":[ { "param1":"10", "type":"UInt32" }, { "param2":"30", "type":"UInt16" } ] }, { "id":1288, "name":"name2 ", "params":[ { "param3":"20", "type":"Date" }, { "param4":"34", "type":"String" }, { "param5":"15", "type":"UInt8" } ] } ]

console.log(a.map(x => ({
  ...x,
  params: x.params.map(p => {
    var keys = Object.keys(p).filter(k => k !== 'type')
    if (keys.length !== 1) throw new Error("Invalid number of keys")
  
    return {
      name: x.name,
      key: keys[0],
      value: p[keys[0]],
      type: p.type,
    }
  }),
})))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка
Автор решения: vsemozhebuty

Если можно менять исходную структуру:

const data = [
   {
      "id":1287,
      "name":"name1",
      "params":[
         {
            "param1":"10",
            "type":"UInt32"
         },
         {
            "param2":"30",
            "type":"UInt16"
         }
      ]
   },
   {
      "id":1288,
      "name":"name2 ",
      "params":[
         {
            "param3":"20",
            "type":"Date"
         },
         {
            "param4":"34",
            "type":"String"
         },
         {
            "param5":"15",
            "type":"UInt8"
         }
      ]
   }
];

for (const item of data) {
  item.params.forEach((param, i, params) => {
    const [key, value] = Object.entries(param).find(
      ([k]) => k.startsWith('param')
    );
    params[i] = {
      name: item.name,
      key: key,
      value: value,
      type: 'UInt32',
    };
  });
}

console.log(JSON.stringify(data, null, '  '));

→ Ссылка