Tengo una matriz de objetos que se parece a esto:
const myArray = [ { bet_line: "1",bet_type: 1, f1: true, f2: true, f3: true, f4: false, f5:false } { bet_line: "1",bet_type: 2, f1: false, f2: true, f3: true, f4: true, f5:false } { bet_line: "1",bet_type: 4, f1: true, f2: false, f3: true, f4: true, f5:false } ... ... ];y lo que quiero obtener es:
const chartData = [ {name:'F1', value:2}, {name:'F2', value:2}, {name:'F3', value:3}, {name:'F4', value:2}, {name:'F5', value:0} ];Ahora, sé cómo obtener cada elemento de una nueva matriz usando la función de matriz:
const f1 = myArray.filter((x,i) => { return x.f1; }).length const f2 = myArray.filter((x,i) => { return x.f1; }).length ...En realidad, hay más de 5 para el elemento F*, como F1~F20, por lo que calcular cada vez no es una forma adecuada. Quiero encontrar una forma más simple, ¿hay alguna forma de hacerlo usando la función Javascript Array ?
Puede usar una sola reduce para "sumar" los elementos. Debido a que son booleanos, es seguro (en javascript...) sumarlos usando + :
const myArray = [ { bet_line: "1",bet_type: 1, f1: true, f2: true, f3: true, f4: false, f5:false }, { bet_line: "1",bet_type: 2, f1: false, f2: true, f3: true, f4: true, f5:false }, { bet_line: "1",bet_type: 4, f1: true, f2: false, f3: true, f4: true, f5:false } ]; const sumBet = (b1, b2) => ({ f1: b1.f1 + b2.f1, f2: b1.f2 + b2.f2, f3: b1.f3 + b2.f3, f4: b1.f4 + b2.f4, f5: b1.f5 + b2.f5 }); const emptyBet = () => ({ f1: false, f2: false, f3: false, f4: false, f5: false }); console.log( myArray.reduce(sumBet, emptyBet()) )Si desea que sea más genérico, puede extraer la definición clave:
const myArray = [ { bet_line: "1",bet_type: 1, f1: true, f2: true, f3: true, f4: false, f5:false }, { bet_line: "1",bet_type: 2, f1: false, f2: true, f3: true, f4: true, f5:false }, { bet_line: "1",bet_type: 4, f1: true, f2: false, f3: true, f4: true, f5:false } ]; const sumKeys = ks => (a, b) => Object.fromEntries(ks.map(k => [k, a[k] + b[k]])); const constKeys = (ks, c) => Object.fromEntries(ks.map(k => [k, c])); const keys = Array.from(Array(5), (_, i) => `f${i + 1}`); console.log( myArray.reduce(sumKeys(keys), constKeys(keys, 0)) )