Lo que necesito es ordenar los datos que obtengo de una API en diferentes matrices, pero agregar el valor '0' donde no hay valor en 1 tipo pero está en el otro tipo/s. Ahora, ¿es esto posible con array.filter ya que es más rápido que un montón de bucles for y if?
Entonces, digamos que obtengo los siguientes datos de SQL a la API:
Day Type Amount ----------------------- 12.1.2022 1 11 12.1.2022 2 4 13.1.2022 1 5 14.1.2022 2 9 16.1.2022 2 30Si ejecuto este código:
this.data = result.Data; let date = []; const data = { 'dataType1': [], 'dataType2': [], 'dataType3': [], 'dataType4': [] } /*only writing example for 2 types since for 4 it would be too long but i desire answer that works for any amount of types or for 4 types */ this.data.forEach(x => { var lastAddress = date[date.length - 1] if (x.type == 1) {dataType1.push(x.Amount) } if (x.type == 2) {dataType2.push(x.Amount) }} lastAddress != x.Day ? date.push(x.Day) : ''; La matriz que obtengo para type1 es [11,5] y para type2 obtengo [4,9,30] . Y para las fechas obtengo todas las fechas únicas.
Pero los datos que me gustaría son: [11,5,0,0] y [4,0,9,30] El tamaño de la matriz también debe coincidir con el tamaño de la matriz Day al final. que serían fechas únicas.. en este caso:
[12.1.2022, 13.1.2022, 14.1.2022, 16.1.2022]
Ya he intentado resolver esto con algunos bucles for, if y while, pero se complica demasiado, así que estoy buscando una alternativa.
También tengo 4 tipos, pero como referencia, solo escribí una muestra para 2.
const type1 = []; const type2 = []; data.forEach(item=>{ if(item.type==1){ type1.push(item.amount) type2.push(0) }else{ type1.push(0) type2.push(item.amount) } }) console.log(type1) console.log(type2)puede
{date:string,values:number[]} //create a function: matrix(data:any[]) { const uniqTypes=data.reduce((a,b)=>a.indexOf(b.type)>=0?a: [...a,b.type],[]) const result=[] this.data.forEach((x:any)=>{ let index=result.findIndex(r=>r.date==x.date) if (index<0) { result.push({date:x.date,values:[...uniqTypes].fill(0)}) index=result.length-1; } result[index].values[uniqTypes.indexOf(x.type)]=x.amount }) return result } //and use like result=this.matrix(this.data);NOTA: Puede crear el uniqType fuera de la función como variable y pasarlo como argumento a la función