Tengo problemas para reformatear una matriz de objetos en Javascript. Tengo una matriz que se ve así:
[ { "deviceid": 42, "x": "2022-03-26T00:00:18", "y": 17.8, }, { "deviceid": 42, "x": "2022-03-26T00:01:18", "y": 17.8, }, { "deviceid": 43, "x": "2022-03-26T00:02:18", "y": 17.8, { "deviceid": 43, "x": "2022-03-26T00:02:18", "y": 17.8, }]Quiero remodelarlo para que el nuevo formulario sea un registro por ID de dispositivo y todos los valores x e y en la misma fila.
[ { "deviceid": 42, "x": ["2022-03-26T00:00:18","2022-03-27T00:00:18"], "y": [17.8, 15.6], }, { "deviceid": 43, "x": ["2022-03-26T00:01:18","2022-03-27T00:00:18"], "y": [17.8, 19.1], }]¿Cómo puedo hacer que esto suceda?
Puede usar reduce() para hacer la reducción de sus valores usando un objeto JavaScript. Después de la reducción, obtenga los valores del objeto usando Object.values() .
const data = [ { deviceid: 42, x: "2022-03-26T00:00:18", y: 17.8, }, { deviceid: 42, x: "2022-03-26T00:01:18", y: 15.6, }, { deviceid: 43, x: "2022-03-26T00:02:18", y: 17.8, }, { deviceid: 43, x: "2022-03-26T00:02:18", y: 19.1, }, ]; const result = data.reduce((devices, device) => { // check if we have encountered this decive before using the deviceId if (!devices.hasOwnProperty(device.deviceid)) { // we have not: create an key-value pair using device ID as key and device info as value // use an array for x and y devices[device.deviceid] = { deviceId: device.deviceid, x: [device.x], y: [device.y], }; } else { // we have seen this device before // get the device value using the key (deviceId) and push new x and y values to it const curDev = devices[device.deviceid]; curDev.x.push(device.x); curDev.y.push(device.y); } // return JS object of devices for next iteration/ result return devices; }, {}); console.log(Object.values(result));Tenga en cuenta: creo que la entrada que proporcionó en su pregunta contiene algunos errores, probablemente al copiar/pegar, ya que la salida esperada contiene valores que no están en la entrada en absoluto. Cambié los valores de
yen la entrada para mostrarle que la salida es realmente lo que espera.