Functional Programming - Josej2r/JavaScript_Algorithms_and_Data_Structures_Certification GitHub Wiki
Functional Programming
Introduction to the Functional Programming Challenges
La programación funcional es un enfoque para el desarrollo de software basado en la evaluación de funciones. Al igual que las matemáticas, las funciones en la programación asignan entrada a salida para producir un resultado. Puede combinar funciones básicas de muchas maneras para crear programas cada vez más complejos.
La programación funcional sigue algunos principios básicos:
-
Las funciones son independientes del estado del programa o de las variables globales. Solo dependen de los argumentos que se les pasan para hacer un cálculo.
-
Las funciones intentan limitar cualquier cambio en el estado del programa y evitar cambios en los objetos globales que contienen datos.
-
Las funciones tienen efectos secundarios mínimos en el programa.
El enfoque de desarrollo de software de programación funcional divide un programa en partes pequeñas y comprobables. Esta sección cubre los principios básicos de programación funcional en JavaScript.
Upcoming Lessons
- Learn About Functional Programming
- Understand Functional Programming Terminology
- Understand the Hazards of Using Imperative Code
- Avoid Mutations and Side Effects Using Functional Programming
- Pass Arguments to Avoid External Dependence in a Function
- Refactor Global Variables Out of Functions
- Use the map Method to Extract Data from an Array
- Implement map on a Prototype
- Use the filter Method to Extract Data from an Array
- Implement the filter Method on a Prototype
- Return Part of an Array Using the slice Method
- Remove Elements from an Array Using slice Instead of splice
- Combine Two Arrays Using the concat Method
- Add Elements to the End of an Array Using concat Instead of push
- Use the reduce Method to Analyze Data
- Use Higher-Order Functions map, filter, or reduce to Solve a Complex Problem
- Sort an Array Alphabetically using the sort Method
- Return a Sorted Array Without Changing the Original Array
- Split a String into an Array Using the split Method
- Combine an Array into a String Using the join Method
- Apply Functional Programming to Convert Strings to URL Slugs
- Use the every Method to Check that Every Element in an Array Meets a Criteria
- Use the some Method to Check that Any Elements in an Array Meet a Criteria
- Introduction to Currying and Partial Application
Learn About Functional Programming
La programación funcional es un estilo de programación donde las soluciones son funciones simples y aisladas, sin efectos secundarios fuera del alcance de la función.
INPUT -> PROCESS -> OUTPUT
La programación funcional:
-
Funciones aisladas: no hay dependencia del estado del programa, que incluye variables globales que están sujetas a cambios.
-
Funciones Puras: la misa entrada siempre da la misma salida.
-
Funciones con efectos secundarios limitados: cualquier cambio o mutación en el estado del programa fuera de la función se controla cuidadosamente.
A los miembros de freeCodeCamp les encante el té.
En el editor de código, las funciones prepareTea y getTea ya están definidas para usted. Llama a la función getTea para obtener 40 tazas de té para el equipo y almacénalas en la variable tea4TeamFCC.
El código con la solución se encuentra aquí:Download
Understand Functional Programming Terminology
El equipo de FCC tuvo un cambio de humor y ahora quiere dos tipos de té: té verde y té negro. Hecho general: los cambios de humos del cliente son bastante comunes.
Con esa información, tendremos que volver a visitar la función getTea
del último desafío para manejar varias solicitudes de té. Podemos modificar getTea
para aceptar una función como parámetro para poder cambiar el tipo de té que prepara. Esto hace que getTea
sea más flexible y le da al programador más control cuando las solicitudes del cliente cambian.
Pero primero, cubramos algo de terminología funcional:
Callbacks son las funciones que se deslizan o pasan a otra función para decidir la invocación de esa función. Es posible que los haya visto pasar a otros métodos, por ejemplo, filter
, la función de callbacks le dice a JavaScript los criterios para filtrar una matriz.
Las funciones que pueden asignarse a una variable, pasarse a otra función o devolverse desde otra función como cualquier otro valor normal, se denominan funciones de primera clase. En JavaScript, todas las funciones son funciones de primera clase.
Las funciones que toman una función como argumento devuelven una función como valor de retorno se denominan funciones de orden superior.
Cuando las funciones se pasan a otra función o se devuelven desde otra función, las funciones que pasan o devuelven se pueden llamar lambda.
Prepare 27 tazas de té verde y 13 de té negro y guárdelas en las variables tea4GreenTeamFCC y tea4GreenTeamFCC , respectivamente. Tenga en cuenta que la función getTea se ha modificado, por lo que ahora toma una función como primer argumento.
Nota: Los datos (el número de tazas de té) se proporcionan como último argumento. Discutiremos esto en más lecciones posteriores.
El código con la solución se encuentra aquí:Download
Understand the Hazards of Using Imperative Code
La programación funcional es un buen hábito. Mantiene su código fácil de administrar y lo salva de errores furtivos. Pero antes de llegar allí, veamos un enfoque imperativo de la programación para resaltar dónde puede tener problemas.
En Inglés (y en muchos otros idiomas), el tiempo imperativo se usa para dar mandatos. Del mismo modo, un estilo imperativo en la programación es aquel que le da a la computadora un conjunto de declaraciones para realizar una tarea.
A menudo, las declaraciones cambian el estado del programa, como actualizar variables globales. Un ejemplo clásico es escribir un bucle for que proporcione instrucciones exactas para iterar sobre los índices de una matriz.
En contraste, la programación funcional es una forma de programación declarativa. Le dice a la computadora lo que quiere hacer llamando a un método o función.
JavaScript ofrece muchos métodos predefinidos que manejan tareas comunes, por lo que no necesita escribir como debe realizarlas la computadora. Por ejemplo, en lugar de usar un bucle for mencionado anteriormente, podría llamar al método de map
que maneja los detalles de iterar sobre una matriz. Esto ayuda a evitar errores semánticos, como los "Off By One Errors" que se trataron en la sección Depuración.
Considere el escenario: está navegando por la web en su navegador y desea realizar un seguimiento de las pestañas que se ha abierto. Intentemos modelar esto usando un código simple orientado a objetos.
Un objeto Windows está formado por pestañas y, por lo general, tiene más de una ventana abierta. Los títulos de cada sitio abierto en cada objeto Windows se mantienen en una matriz. Después de trabajar en el navegador (abrir pestañas nuevas, fusionar ventanas y cerrar pestañas), desea imprimir las pestañas que aún están abiertas.Las pestañas cerradas se eliminan de la matriz y se agregan pestañas nuevas (por simplicidad) al final de la misma.
El editor de código muestra una implementación de esta funcionalidad con funciones para tabOpen()
, tabClose()
, join()
. Las pestañas de matriz forman parte del objeto Windows que almacena el nombre de las páginas abiertas.
Examina el código en el editor. Está utilizando un método que tiene efectos secundarios en el programa, causando un comportamiento incorrecto. La lista final de pestañas abiertas, almacenada en finalTabs.tabs
debe ser ['FB', 'Gitter', 'Reddit', 'Twitter', 'Medium', 'new tab', 'Netflix', 'YouTube', 'Vine', 'GMail', 'Work mail', 'Docs', 'freeCodeCamp', 'new tab']
pero la lista producida por el código es ligeramente diferente.
Cambie Window.prototype.tabClose
para que elimine la pestaña correcta.
El código con la solución se encuentra aquí:Download
Avoid Mutations and Side Effects Using Functional Programming
Si aún no lo ha resuelto, el problema en el desafío anterior fue con la llamada splice en tabClose(). Desafortunadamente, splice cambia la matriz original a la que se llama, por lo que la segunda llamada a ella utilizo una matriz modificada y dio resultados inesperados.
Este es un pequeño ejemplo de un patrón mucho más grande, llama a una función en una variable, matriz o un objeto y la función cambia la variable o algo en el objeto.
Uno de los principios centrales de la programación funcional es no cambiar las cosas. Los cambios conducen a errores sabiendo que sus funciones no cambian nada, incluidos los argumentos de la función o cualquier variable global.
El ejemplo anterior, no tenía operaciones complicadas, pero el método de splice cambió la matriz original y resultó en un error.
Recuerde que en la programación funcional, cambiar o alterar las cosas se llama mutación, y el resultado se llama efecto secundario. Una función, idealmente, debería ser una función pura, lo que significa que no causa ningún efecto secundario.
Intentemos dominar esta disciplina y no alterar ninguna variable u objeto en nuestro código.
Complete el código para la función incrementer que devuelva el valor de la variable global fixedValue
incrementada en 1.
El código con la solución se encuentra aquí: Download
Pass Arguments to Avoid External Dependence in a Function
El último desafío fue un paso más cerca de los principios de programación funcional, pero todavía falta algo.
No modificamos el valor de la variable global pero el incrementer de funciones no funcionaría sin que la variable global fixedValue
estuviera allí.
Otro principio de las programación funcional es declarar siempre sus dependencias explícitamente. Esto significa que si una función depende de una variable u objeto presente, entonces pase esa variable u objeto directamente a la función como argumento.
Otro principio de la programación funcional es declarar siempre sus dependencias explícitamente. Esto significa que si una función depende de una variable u objeto presente, entonces pase a esa variable u objeto directamente a la función como argumento.
Hay varias buenas consecuencias de este principio. La función es más fácil de probar, usted sabe exactamente qué entrada necesita y no dependerá de nada más en su programa.
Esto puede darle más confianza cuando altera, elimina o agrega código nuevo. Sabría lo que puedes o no puedes cambiar y puedes ver dónde están las trampas potenciales.
Finalmente, la función siempre produciría la misma salida para el mismo conjunto de entradas, sin importar qué parte del código la ejecute.
Actualicemos la función de increment para declarar claramente sus dependencias.
Escriba la función de increment para que tome un argumento y luego lo aumente el valor en uno.
El código con la solución se encuentra aquí:Download
Refactor Global Variables Out of Functions
Hasta ahora, hemos visto dos principios distintos para la programación funcional:
-
No modifique una variable u objeto: cree nuevas variables y objetos y devuélvalos si es necesario.
-
Declarar argumentos de función: cualquier cálculo dentro de una función depende solo de los argumentos y no de ningún objeto o variable global.
Agregue uno a un número no es muy emocionante, pero podemos aplicar estos principios al trabajar con matrices y objetos más complejos.
Vulva a escribir el código para que la matriz bookList no cambie dentro de ninguna de las funciones. La función de add debe agregar el bookName al final de la matriz que se le pasó y devolver una nueva matriz. La función remove debería eliminar el bookName del libro dado de la matriz que se le paso.
Nota: ambas funciones deber devolver una matriz y cualquier parámetro nuevo debe agregarse antes del parámetro bookName .
El código con la solución se encuentra aquí:Download
Use the map Method to Extract Data from an Array
Hasta ahora hemos aprendido a usar funciones puras para evitar efectos secundarios en un programa. Además, hemos visto que el valor de una función solo depende de sus argumentos de entrada.
Este es sólo el comienzo. Como su nombre lo indica, la programación funcional se centra en una teoría de funciones.
Tendría sentido poder pasarlos como argumentos a otras funciones y devolver una función desde otra función. Las funciones se consideran objetos de primera clase en JavaScript, lo que significa que se pueden usar como cualquier otro objeto. Pueden guardarse en variables, almacenarse en un objeto o pasarse como argumentos de función.
Comencemos con algunas funciones de matriz simples, que son métodos en el prototype de un objeto matriz. En este ejercicio estamos viendo Array.prototype.map (), o más simplemente map.
El método de map itera sobre cada elemento en una matriz y devuelve una nueva matriz que contiene los resultados de llamar a la función de devolución de llamada en cada elemento. Hace esto sin mutar la matriz original.
Cuando se utiliza la devolución de llamada, se le pasan tres argumentos. El primer argumento es el elemento actual que se está procesando. El segundo es el índice de ese elemento y el tercero es la matriz sobre la que se llamó al método de map.
Vea a continuación un ejemplo del uso del método de map en la matriz de users para devolver una nueva matriz que contenga solo los nombre de los usuarios como elementos. Por simplicidad, el ejemplo solo usa el primer argumento de la devolución de llamada.
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const names = users.map(user => user.name);
console.log(names); // [ 'John', 'Amy', 'camperCat' ]
La matriz watchList
contiene objetos con información sobre varias películas. Use map en watchList
para asignar una nueva matriz de objetos solo con los title y rating de la variable ratings. El código en el editor actualmente usa un bucle for para hacer esto, por lo que debe reemplazar la funcionalidad del bucle con su expresión de map.
El código con la solución se encuentra aquí:Download
Implement map on a Prototype
Como ha visto al aplicar Array.prototype.map() o simplemente map(), el método de map devuelve una matriz de la misma longitud que la que se le solicitó. Tampoco altera la matriz original, siempre que su función de devolución de llamada no lo haga.
En otras, palabras, map es una función pura, y su salida depende únicamente de sus entradas. Además, toma otra función como argumento.
Nos enseñaría mucho sobre map para tratar de implementar una versión que se comporte exactamente como Array.prototype.map() con un bucle for o Array.prototype.forEach ()..
Nota: se permite que una función pura altere las variables locales definidas dentro de su alcance también es preferible evitar eso.
Escriba su propio Array.prototype.myMap() que debería comportarse exactamente como Array.prototype.map(). Puede usar un bucle for o el método forEach.
El código con la solución se encuentra aquí:Download.
Use the filter Method to Extract Data from an Array
Otra función de matriz útil es Array.prototype.filter(), o simplemente filter().
filter
llama a una función en cada elemento de una matriz y devuelve una nueva matriz que contiene solo los elementos para los que esa función devuelve verdadero. En otra palabras, filtra la matriz, en función de la función que se le pasa. Al igual que map, lo hace sin necesidad de modificar la matriz original.
La función de devolución de llamada acepta tres argumentos. El primer argumento es el elemento actual que se está procesando. El segundo es el índice de ese elemento y el tercero es la matriz sobre la cual se llamó al método de filter.
Vea a continuación un ejemplo usando el método de filter en la matriz de usuarios para devolver una nueva matriz que contenfa solo los usuarios menores de 30 años. Para simplificar, el ejemplo solo usa el primer argumento de la devolución de llamada.
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const usersUnder30 = users.filter(user => user.age < 30);
console.log(usersUnder30); // [ { name: 'Amy', age: 20 }, { name: 'camperCat', age: 10 } ]
La variable watchList contiene una variedad de objetos con información sobre varias películas. Use una combinación de filter y map en watchList para asignar una nueva matriz de objetos solo con title y rating. La nueva matriz solo debe incluir objetos donde imdbRating sea mayor o igual que 8.0. Tenga en cuenta que los valores de clasificación se guardan como cadenas en el objeto y es posible que deba convertirlos en números para realizar operaciones matemáticas en ellos.
El código con la solución se encuentra aquí:Download
Implement the filter Method on a Prototype
Nos enseñaría mucho sobre el método filter si intentamos implementar una versión del mismo que se comporte exactamente como Array.prototype.filter (). Puede usar un bucle for o Array.prototype.forEach().
Nota: se permite que una función pura altere las variables locales definidas dentro de su alcance, aunque también es preferible evitar eso.
Escriba su propio Array.prototype.myFilter (), que debería comportarse exactamente como Array.prototype.filter (). Puede usar un bucle for o el método Array.prototype.forEach ().
El código con la solución se encuentra aquí:Download.
Return Part of an Array Using the slice Method
El método de slice
devuelve una copia de ciertos elementos de una matriz. Puede tomar dos argumentos, el primero da el índice de dónde comenzar el segmento, el segundo es el índice de dónde terminar el segmento, sin incluirlo. Si no se proporcionan los argumentos, el valor predeterminado es comenzar desde el principio de la matriz hasta el final, que es una manera fácil de hacer una copia de toda la matriz. El método de slice no muta la matriz original, pero devuelve una nueva.
Aquí hay un ejemplo:
var arr = ["Cat", "Dog", "Tiger", "Zebra"];
var newArray = arr.slice(1, 3);
// Sets newArray to ["Dog", "Tiger"]
Utilice el método de slice en la función sliceArray para devolver parte de la matriz de anim dados los índices beginSlice y endSlice proporcionados. La función debe devolver una matriz.
El código con la solución se encuentra aquí:Dowload
Remove Elements from an Array Using slice Instead of splice
Un patrón común al trabajar con matrices es cuando desea eliminar elementos y conservar el resto de la matriz. JavaScript ofrece el método de splice
para esto, que toma argumentos para el índice de dónde comenzar a eliminar elementos, luego la cantidad de elementos a eliminar. Si no se proporciona el segundo argumento, el valor predeterminado es eliminar elementos hasta el final. Sin embargo, el método de splice muta la matriz original a la que se llama. Aquí hay un ejemplo:
var cities = ["Chicago", "Delhi", "Islamabad", "London", "Berlin"];
cities.splice(3, 1); // Returns "London" and deletes it from the cities array
// cities is now ["Chicago", "Delhi", "Islamabad", "Berlin"]
Como vimos en el último desafío, el método de slice no muta la matriz original, sino que devuelve una nueva que se puede guardar en una variable. Recuerde que el método de slice toma dos argumentos para que los índices comiencen y finalicen la división (el final no es inclusivo), y devuelve esos elementos en una nueva matriz. El uso del método de slice en lugar de splice ayuda a evitar cualquier efecto secundario que mute la matriz.
Reescriba la función nonMutatingSplice utilizando slice en lugar de splice. Debe limitar la matriz de cities proporcionadas a una longitud de 3 y devolver una nueva martiz con solo los primeros tres elementos.
El código con la solución se encuentra aquí:Download
Combine Two Arrays Using the concat Method
Concatenación significa unir elementos de punta a punta. JavaScript ofrece el método concat
para cadenas y matrices que funcionan de la misma manera. Para las matrices, el método se llama en uno, luego se proporciona otra matriz como argumento para concat
, que se agrega al final de la primera matriz. Devuelve una nueva matriz y no muta ninguna de las matrices originales. Aquí hay un ejemplo:
[1, 2, 3].concat([4, 5, 6]);
// Returns a new array [1, 2, 3, 4, 5, 6]
Use el método concat en la función nonMutatingConcat para concatenar el adjunto al final del originl. La función debe devolver la matriz concatenada.
El código con la solución se encuentra aquí:Download
Add Elements to the End of an Array Using concat Instead of push
La programación funcional se trata de crear y usar funciones no mutantes.
En el último desafío introdujo el método concat como una forma de combinar matrices en una nueva sin mutar las matrices originales.Compare concat con el método push. Push agrega un elemento al final de la misma matriz en la que se llama, que muta esa matriz. Aquí hay un ejemplo:
var arr = [1, 2, 3];
arr.push([4, 5, 6]);
// arr is changed to [1, 2, 3, [4, 5, 6]]
// Not the functional programming way
Concat ofrece una manera de agregar nuevos elementos al final de una matriz sin efectos secundarios mutantes.
Cambie la función nonMutatingPush para que use concat para agregar newItem al final del original en lugar de push. La función debe devolver una matriz.
El código con la solución se encuentra aquí:Download
Use the reduce Method to Analyze Data
Array.prototype.reduce () o simplemente reduce()
, es la más general de todas las operaciones de matriz en JavaScript. Puede resolver casi cualquier problema de procesamiento de matriz utilizando el método reduce
.
El método reduce permite formas más generales de procesamiento de matriz, y es posible mostrar que tanto filter como map pueden derivarse como aplicaciones especiales de reduce. EL método reduce itera sobre cada elemento en una matriz y devuelve un solo valor ( es decir, cadena, número, objeto, matriz). Esto se logra mediante una función de devolución de llamada que se llama en cada iteración.
La función de devolución de llamada acepta cuatro argumentos. El primer argumento se conoce como el acumulador, al que se le asigna el valor de retorno de la función de devolución de llamada de la iteración anterior, el segundo es el elemento actual que se está procesando, el tercero es el índice de ese elemento y el cuarto es la matriz sobre la que se llama reduce
.
Además de la función de devolución de llamada, reduce tiene un parámetro adicional que toma un valor inicial para el acumulador.Si no se utiliza este segundo parámetro, se omita la primera iteración y la segunda iteración para al primer elemento de la matriz como acumulador.
Vea a continuación un ejemplo de reduce en la matriz de users para devolver la suma de todas las edades de los usarios. Por simplicidad, el ejemplo solo usa el primer y el segundo argumento.
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const sumOfAges = users.reduce((sum, user) => sum + user.age, 0);
console.log(sumOfAges); // 64
En otro ejemplo, vea cómo se puede devolver un objeto que contiene los nombres de los usuarios como propiedades con sus edades como valores.
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const usersObj = users.reduce((obj, user) => {
obj[user.name] = user.age;
return obj;
}, {});
console.log(usersObj); // { John: 34, Amy: 20, camperCat: 10 }
La variable watchList contiene una variedad de objetos con información sobre varias películas. Use reduce para encontrar las clasificación promedio de IMDB de las películas dirigidas por Christopher Nolan. Recuerde de desafíos anteriores cómo filter datos y map para obtener lo que necesita. Es posible que deba crear otras variables y devolver la calificación promedio de la función getRating. Tenga en cuenta que los valores de clasificación se guardan como cadenas en el objeto y deben convertirse en números antes de usarse en cualquier operación matemática.
El código con la solución se encuentra aquí:Download
Use Higher-Order Functions map, filter, or reduce to Solve a Complex Problem
Ahora que ha superado algunos desafíos utilizando funciones de orden superior como map(), filter() y reduce(), ahora puede aplicarlos para resolver un desafío más complejo.
Hemos definido una función llamada squareList. Debe completar el código para la función squareList usando cualquier combinación de map(), filter() y reduce() para que devuelva una nueva matriz que contiene solo el cuadrado de solo los enteros positivos (los números decimales no son enteros) cuando se le pasa una matriz de números reales. Un ejemplo de una matriz que contiene solo números reales es [-3, 4.8, 5, 3, -3.2].
Nota: Su función no debe usar ningún tipo de bucles for, while o la función forEach().
El código con la solución se encuentra aquí:Download
Sort an Array Alphabetically using the sort Method
El método de clasificación clasifica los elementos de una matriz de acuerdo con la función de devolución de llamada.
Por ejemplo:
function ascendingOrder(arr) {
return arr.sort(function(a, b) {
return a - b;
});
}
ascendingOrder([1, 5, 2, 3, 4]);
// Returns [1, 2, 3, 4, 5]
function reverseAlpha(arr) {
return arr.sort(function(a, b) {
return a === b ? 0 : a < b ? 1 : -1;
});
}
reverseAlpha(['l', 'h', 'z', 'b', 's']);
// Returns ['z', 's', 'l', 'h', 'b']
El método de clasificación predeterminado de JavaScript es por valor de punto Unicode de cadena, que puede devolver resultados inesperados. Por lo tanto, se recomienda proporcionar una función de devolución de llamada para especificar cómo ordenar los elementos de la matriz. Cuando se proporciona una función de devolución de llamada, normalmente llamada compareFunction, los elementos de la matriz se ordenan de acuerdo con el valor de retorno de compareFunction: Si compareFunction (a,b) devuelve un valor menor que 0 para dos elementos a y b , entonces a vendrá antes que b. Si compareFunction(a,b) devuelve un valor mayor que 0 es para dos elementos a y b , entonces b vendrá antes que a. Si compareFunction(a,b) devuelve un valor igual a 0 para dos elementos a y b, entonces a y b permanecerán sin cambios.
Utilice el método de sort en la función alphabeticalOrder para ordenar los elementos de arr en orden alfabético.
El código con la solución se encuentra aquí:Download
Return a Sorted Array Without Changing the Original Array
Un efecto secundarios del método sort es que cambia el orden de los elementos en la matriz original. En otras palabras, muta la matriz en su lugar. Una forma de evitar esto es concatener primero una matriz vacía a la que se está ordenando ( recuerde que slice y concat devuelven una nueva matriz), luego ejecute el método de sort.
Utilice el método sort en la función nonMutatingSort para ordenar los elementos de una matriz en orden ascendente. La función debería devolver una nueva matriz y no mutar la variable globalArray.
El código con la solución se encuentra aquí:Download
Split a String into an Array Using the split Method.
El método de split
divide una cadena en una matriz de strings. Se necesita un argumento para el delimitador, que puede ser un carácter para dividir la cadena o una expresión regular. Por ejemplo, si el delimitador es un espacio, obtienes una matriz de palabras, y si el delimitador es una cadena vacía, obtienes una matriz de cada carácter en la cadena.
Aquí hay dos ejemplos que dividen una cadena por espacios, luego otra por dígitos usando una expresión regular:
var str = "Hello World";
var bySpace = str.split(" ");
// Sets bySpace to ["Hello", "World"]
var otherString = "How9are7you2today";
var byDigits = otherString.split(/\d/);
// Sets byDigits to ["How", "are", "you", "today"]
Como las cadenas son inmutables, el método de split facilita el trabajo con ellas.
Use el método de split dentro de la función splitify para dividir str en una matriz de palabras. La función debería devolver la matriz. Tenga en cuenta que las palabras no siempre están separados por espacios, y la matriz no debe contener signos de puntuación.
El código con la solución se encuentra aquí:Download
Combine an Array into a String Using the join Method
El método join
se usa para unir los elementos de una matriz para crear una cadena. Se necesita un argumento para el delimitador que se utiliza para separa los elementos de la matriz en la cadena.
Aquí hay un ejemplo:
var arr = ["Hello", "World"];
var str = arr.join(" ");
// Sets str to "Hello World"
Use el método join (entre otros) dentro de la función sentensify para hacer una oración a partir de las palabras en la cadena str. La función debería devolver una cadena. Por ejemplo, "I-like-Star-Wars" se convertiría en "I like Star Wars". Para este desafío, no use el método de replace.
El código con la solución se encuentra aquí:Download
Apply Functional Programming to Convert Strings to URL Slugs
Los últimos desafíos cubrieron una serie de métodos útiles de matriz y cadena que siguen los principios de programación funcional. También hemos aprendido acerca de reduce, que es un método poderos utilizado para reducir problemas a formas más simples. Desde los promedios informáticos hasta la clasificación, cualquier operación de matriz se puede lograr aplicándola. Recuerde que map y filter son casos especiales de reduce.
Combinemos lo que hemos aprendido para resolver un problema práctico.
Muchos sitios de administración de contenido (CMS) tienen los títulos de una publicación agregados a aprte de la URL para fines de marcadores simples. Por ejemplo, si escribe una publicación de Medium titulada "Stop Using Reduce", es probable que la URL tenga alguna forma de la cadena de título ("... / stop-using-reduce"). Es posible que ya haya notado esto en el sitio freeCodeCamp.
Complete la función urlSlug para que convierta un title de cadena y devuelva la versión con guión para la URL. Puede usar cualquier de los métodos cubiertos en esta sección, y no usar replace. Aquí están los requisitos:
La entrada es una cadena con espacios y palabras en mayúsculas.
La salida es una cadena con los espacios entre palabras remplazados por un guión (-).
La salida debe ser todas letras minúsculas.
La salida no debe tener espacios.
El código con la solución se encuentra aquí:Download
Use the every Method to Check that Every Element in an Array Meets a Criteria
El método every
funciona con matrices para verificar si cada elemento pasa una prueba en particular. Devuelve un valor boolenano -true si todos los valores cumplen los criterios, -false si no.
Por ejemplo, el siguiente código verificará si cada elemento en la matriz de números es menor que 10:
var numbers = [1, 5, 8, 0, 10, 11];
numbers.every(function(currentValue) {
return currentValue < 10;
});
// Returns false
Utilice el método every dentro de la función checkPositive para verificar si cada elemento en arr es positivo. La función debe devolver un valor boolenano.
El código con la solución se encuentra aquí:Download
Use the some Method to Check that Any Elements in an Array Meet a Criteria
El método some
funciona con matrices para verificar si algún elementos pasa una prueba en particular. Devuelve un valor booleano: -true si alguno de los valores cumple los criterios, -false si no.
Por ejemplo, el siguiente código verificará si algún elemento en la matriz de números es menos que 10:
var numbers = [10, 50, 8, 220, 110, 11];
numbers.some(function(currentValue) {
return currentValue < 10;
});
// Returns true
Use el método some en lugar de la función checkPositive para verificar si algún elemento en arr es positivo. La función debe devolver un valor booleano.
El código con la solución se encuentra aquí:Download
Introduction to Currying and Partial Application
La arity de una función es la cantidad de argumentos que requiere. Hacer Currying de un función significa convertir una función de N arity en N funciones de arity 1.
En otras palabras, reestructura una función para que tome un argumento, luego devuelve otra función que toma el siguiente argumento, y así sucesivamente.
Aquí hay un ejemplo:
//Un-curried function
function unCurried(x, y) {
return x + y;
}
//Curried function
function curried(x) {
return function(y) {
return x + y;
}
}
//Alternative using ES6
const curried = x => y => x + y
curried(1)(2) // Returns 3
Esto es útil en su programa si no puede proporcionar todos los argumentos de una función a la vez. Puede guardar cada llamada de la función en un variable, que contendrá la referencia de función devuelta que toma el siguiente argumento cuando esté disponible.
Aquí hay un ejemplo usando la función curry en el ejemplo anterior:
// Call a curried function in parts:
var funcForY = curried(1);
console.log(funcForY(2)); // Prints 3
Del mismo modo, la aplicación parcial se puede describir como la aplicación de algunos argumentos a una función a la vez y la devolución de otra función que se aplica a más argumentos. Aquí hay un ejemplo:
//Impartial function
function impartial(x, y, z) {
return x + y + z;
}
var partialFn = impartial.bind(this, 1, 2);
partialFn(10); // Returns 13
Rellene el cuerpo de la función de add para que use currying para agregar los parámetros x, y , z.
El código con la solución se encuentra aquí:Download