Realmente estoy luchando con la transformación de Objeto. Tengo una matriz de objetos y quiero transformarla en una entrada de gráfico multilínea de Highcharts.
Original:
[{ "date": "1997-09-29", "Count": 100, "ID": "AB12-R" }, { "date": "1997-12-30", "Count": 104.7, "ID": "AB13-R" }, { "date": "1997-12-30", "Count": 1192, "ID": "BA12-R" }, { "date": "1998-03-30", "Count": 981, "ID": "BA12-R" }, { "date": "1998-06-01", "Count": 341, "ID": "BA12-R" } ]Producción:
[ { Identiy: 'AB12-R', data: [100, null, null, null] }, { Identiy: 'AB13-R', data: [null, 104.7, null, null] }, { Identiy: 'BA12-R', data: [null, 1192, 981, 341] } ]Explicación:
En Original, tengo 4 fechas únicas, por lo tanto, la longitud de los datos para cada identidad es 4. Ahora, para cada fecha única, verificaré si hay alguna entrada en Original, si es así, la insertaré en datos si no es nula.
Mi código:
De alguna ayuda de, esto es lo que estaba intentando. Pero esto no es verificar las fechas únicas y solo crear la longitud del objeto de datos que es igual al número de objetos en el Original. Aquí está esa implementación https://jsfiddle.net/3u9penko/
const data = [{"date":"1997-09-29","Count":100,"ID":"AB12-R"},{"date":"1997-12-30","Count":104.7,"ID":"AB13-R"},{"date":"1997-12-30","Count":1192,"ID":"BA12-R"},{"date":"1998-03-30","Count":981,"ID":"BA12-R"},{"date":"1998-06-01","Count":341,"ID":"BA12-R"}]; const hcData = []; data.forEach((d, i) => { const checkIfExist = hcData.find(data => data.id === d["ID"]) if (checkIfExist) { checkIfExist.data[i] = d["Count"]; } else { const initialData = [...Array(data.length)] initialData.fill(null, 0, data.length) initialData[i] = d["Count"]; hcData.push({ data: initialData, id: d["ID"] }) } }) console.log(hcData)Cree un mapa de fechas únicas para indexar usando un Set para obtener las fechas únicas y luego convertirlo en un mapa con la fecha como clave y el índice como valor.
Reduzca la matriz a un mapa usando la ID como clave e inicializando el valor con una matriz vacía, que tiene la longitud del tamaño del mapa de dates lleno con null . Agregue el valor del objeto actual a la matriz de nulos en el índice de la date en el mapa de dates .
Convierta el Mapa en una matriz de objetos usando Array.from() .
const fn = arr => { // create a Map of uniqe dates with their index const dates = new Map(Array.from( new Set(arr.map(o => o.date)), (v, i) => [v, i] )) return Array.from( arr.reduce((acc, o, i) => { // if an ID doesn't exist on the Map init it with an empty array of null values (counts) if(!acc.has(o.ID)) acc.set(o.ID, new Array(dates.size).fill(null)) // add the current ID count to the array of counts acc.get(o.ID)[dates.get(o.date)] = o.Count return acc }, new Map), ([Identity, data]) => ({ Identity, data }) // convert to an array of objects ) } const arr = [{"date":"1997-09-29","Count":100,"ID":"AB12-R"},{"date":"1997-12-30","Count":104.7,"ID":"AB13-R"},{"date":"1997-12-30","Count":1192,"ID":"BA12-R"},{"date":"1998-03-30","Count":981,"ID":"BA12-R"},{"date":"1998-06-01","Count":341,"ID":"BA12-R"}] const result = fn(arr) console.log(result)