Taula de JavaScript. reduir

Programació 2021.02.07 01:56:03

JavaScript Array.reduce () Publicat originalment per jefflowery en com et odi? Dejame comptar les formes … La Array.reduce () ha existit durant algun temps. M’agrada map (), filter () i find (), opera en una matriu de valors Invocant una funcio de devolucion de trucada. Aqui hi ha un exemple de desenvolupador de sitios.mozilla.org: const array1 =; const reducer = (acumulador, valor actual) = > acumulador + valor actual; // 1 + 2 + 3 + 4 console.log (array1.reduce (reducer)); // resultat esperat: 10 // 5 + 1 + 2 + 3 + 4 console .log (array1.reduce (reducer, 5)); // resultat esperat: 15 Sona simple, oi? Sobre les queixes: 0. No fa el que espera Fem una ullada a això novament: const array1 =; const reducer = (acumulador, valor actual) = > acumulador + valor actual; / / Esperava: 1 + 2 + 3 + 4 == = 10 Ara modifiqui la funció de reducció per afegir 1 a cada valor en la matriu, després afegiré el valor anterior. agrego 1 a quatre elements de la matriu, espero obtenir somyo de 14. const array1 =; const reducer = (acumulador, currentValue) = > acumulador + currentValue +1; // (1 + 1) + (2 + 1) + (3 + 1) + (4 + 1) = 2 + 3 + 4 + 5 = 14 console.log (array1.reduce (reductor)); // resultat inesperat: 13 Espera … ¿que? Resulta que el primer element de la matriu és el valor inicial de l’acumulador. Llavors, en lloc de (1 + 1) + (2 + 1) + (3 + 1) + (4 + 1) = 2 + 3 + 4 + 5 = 14 De fet és: 1 + (2 + 1) + (3 + 1) + (4 + 1) = 2 + 3 + 4 + 5 = 13 Tots aquests redueixen exemples línia usant una funció de summa ens agrada la il.lustració gràfica, ¿podem enganyar. Per descomptat, pot trobar la resposta correcta: simplement afegiu un valor acumulador inicial com a segon argument a l’mètode de reducció: console.log (array1 Redueix (reducer, 0)); // resultat desitjat: 14 1. Té un nom incorrecte El nom redueix suggeriria que redueix una matriu d’elements a un subconjunt d’aquests elements. Això no és realment el que fa. Pot fer el contrari de reduir, de fet: const array1 =; // Augment constant de quatre elements = (acumulador, valor actual) = > {acumulador.push (valor actual); acumulador.push (valor actual * valor actual); acumulador de retorn; }; console.log (array1.reduce (multiplicador,)); // sortida: Array (8 eelementos) I ni tan sols cal retornar una matriu: const array1 =; transformador transformador = (acumulador, valor actual) = > {acumulador = valor actual * valor actual; acumulador de retorn; }; console.log (array1.reduce (transformador, {})); // resultat: Objecte {1: 1, 2: 4, 3: 9, 4: 16} 2. L’ordre dels arguments de devolucion de trucada és estrany Comparem les devolucions de trucada de map (), filter (), find () i reduccion (): map: (currentValue, índex, matriu, això) = > {} filtre: (valor actual, índex, matriu, això) = > {} cercar: (valor actual, índex, matriu, això) = > {} col·lapsar: (acumulador, valor actual, índia x, matriu) = > {} la seva devolució de trucada obtindrà l’acumulador comoese primer argument, i no en currentValue; A més, cap parametre accepta aquest argument. 3. Error: myVar.reduce no és una funció Estava espatllat per lodash, que tracta tant amb matrius com amb objectes com col·leccions, i les col·leccions tenen mètodes de mapatge, trobar, filtrar i contreure. No si estigui habilitat minimitzat: var obj1 = {mi: “gos”, té: “puces”}; valors const = (acumulador, valor actual) = > acumulador.push (valor actual); console.log (obj1.reduce (valors,)); // > Error: obj1.reduce no és una funció Com va dir Dana Carvey, “No, guanyi no ho facis. No seria segur. (Si, sóc tan vell.) Sempre pot fer alguna cosa com això, usant Object.values oEntradas d’objecte: var obj1 = {mi: “gos”, a: “xips”}; valors constants = (acc,) = > {acc.push (valor); return acc} console.log (Object.entries (obj1) Redueix (valors,)); // > Array 4. L’acumulador de vegades és opcional, de vegades resultats aleatoris és fàcil oblidar un valor d’acumulador inicial, fins i tot quan ho necessita. Prenguem l’exemple anterior, amb una modificació: var obj1 = {mi: “gos”, té: “puces”}; valors constants = (acc,) = > {acc.push (valor); return acc} console.log (Object.entries (obj1) Redueix (valors)); // > matriu ¿Vas sentir la diferència en el codi? Dificil de detectar. Pitjor encara, obtens una matriu de valors, excepte que el primer no i s valgut. Afortunadament, algun dia tindré algunes proves! 5. Ind¿finito? Eh? Oh, oblit tornar el acumulador. Idiota.Mai cometo aquest error : var obj1 = { mi: ” gos “, té : ” puces ” } ; gos constant = ( acc , ) = > { if ( clau === “el meu ” ) { acc.push ( valor ) ; esquena acc ; } } Console.log ( Object.entries ( obj1 ) Redueix ( gos, ) ) ; // > undefined Sempre ha de tornar l’acumulador : var obj1 = { mi : ” dog “, té : ” puces ” } ; gos constant = ( acc , ) = > { if ( clau === “el meu ” ) { acc.push ( valor ) ; } Return acc ; } Console.log ( Object.entries ( obj1 ) Redueix ( gos, ) ) ; Llavors, que hauria recomanar en lloc de minimitzar ( ) ? Jo sempre ús Array.reduce ( ) , i vostè també hauria de fer-ho . Conegui les seves peculiaritats. És com un petit chihuahua que et mossega els talons i que de vegades et atrapés si no tens compte, però en la seva majoria és inofensiu ( i bimas útil que un chihuahua ) . Bona reducció ! secció >

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *