Me gustaría hacer una función que haga lo mismo que el método join(), pero no sé qué estoy haciendo mal.
const join = (arr, separator) => { return arr.reduce((separator, el) => el + separator, separator); }; console.log(join([1, 2, 3], '-'));
devuelve 321- en lugar de 1-2-3
Reduzca los trabajos de izquierda a derecha, pero el orden y la denominación de sus parámetros pueden generar confusión.
La devolución de llamada reduce toma dos argumentos, donde el primer argumento es 'valor acumulado', y el segundo es el elemento actual de la matriz. El 'valor acumulado' aquí será su cadena unida, por lo que debe construirla en el orden correcto, comenzando la cadena con el primer elemento de la matriz y no con el separador en sí.
Entonces, para lograr esto, evite usar un valor predeterminado para la llamada de reduce
y, en su lugar, devuelva la cadena unida (hasta ahora) más el separador más el elemento actual. Asegúrese de manejar el caso de una matriz vacía también de alguna manera.
const join = (arr, separator) => { if (!arr.length) return ""; return arr.reduce((joined, el) => joined + separator + el); }; console.log(join([1, 2, 3], '-'));
Aquí hay un ejemplo en el que he agregado algunos registros a la función exampleJoin
para que pueda ver lo que está haciendo. Luego hay un método de join
final en la parte inferior que es lo que está buscando al final.
const exampleJoin = (arr, separator) => { return arr.reduce((acc, el ) => { console.log(`string so far: '${acc}', Current element: '${el}'`) return acc + el + separator }, ''); }; const ret = exampleJoin([1, 2, 3], '-') console.log(`ret value: ${ret}`) console.log(`ret value after slice ${ret.slice(0,-1)}`) const join = (arr, separator) => { return arr.reduce((acc, el ) => acc + el + separator, '').slice(0,-1); }; console.log(join([1, 2, 3], '-'));
El acc
es el valor acumulado hasta el momento, el
es el elemento actual que se está procesando y el sting vacío es el valor inicial del acumulador acc
. El segmento es para eliminar el separador final que introducirá este método.
Solo necesitaba un pequeño ajuste:
const join = (arr, separator) => { return arr.reduce((acc, el) => acc + separator + el); }; console.log(join([1, 2, 3], '-'));