Skip to main content
Stack Overflow
  1. About
  2. For Teams

Return to Answer

added 834 characters in body
Source Link
Mulan
  • 136.1k
  • 35
  • 240
  • 276

Derived from tail-recursive foldl – Note foldl chooses a similar technique used above: additional parameter with default assignment.

const identity = x =>
 x
const foldl = (f = identity, acc = null, xs = [], i = 0) =>
 i >= xs.length
 ? acc
 : foldl
 ( f
 , f (acc, xs[i])
 , xs
 , i + 1
 )
const recursiveMap = (f = identity, xs = []) =>
 foldl
 ( (acc, x) => acc .concat ([ f (x) ])
 , []
 , xs
 )
 
const square = (x = 0) =>
 x * x
 
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]


Derived from tail-recursive foldl – Note foldl chooses a similar technique used above: additional parameter with default assignment.

const identity = x =>
 x
const foldl = (f = identity, acc = null, xs = [], i = 0) =>
 i >= xs.length
 ? acc
 : foldl
 ( f
 , f (acc, xs[i])
 , xs
 , i + 1
 )
const recursiveMap = (f = identity, xs = []) =>
 foldl
 ( (acc, x) => acc .concat ([ f (x) ])
 , []
 , xs
 )
 
const square = (x = 0) =>
 x * x
 
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]

added 172 characters in body
Source Link
Mulan
  • 136.1k
  • 35
  • 240
  • 276

Below are a few alternatives. All examples do not mutate the input.Each recursiveMap

  • does not mutate input
  • produces a new array as output
  • produces a valid result when an empty input is given, []
  • uses a single pure, functional expression

CuteTail recursive (and cute)

Below are a few alternatives. All examples do not mutate the input.

Cute

Below are a few alternatives. Each recursiveMap

  • does not mutate input
  • produces a new array as output
  • produces a valid result when an empty input is given, []
  • uses a single pure, functional expression

Tail recursive (and cute)

Source Link
Mulan
  • 136.1k
  • 35
  • 240
  • 276

Below are a few alternatives. All examples do not mutate the input.


Destructuring assignment

const identity = x =>
 x
const recursiveMap = (f = identity, [ x, ...xs ]) =>
 x === undefined
 ? []
 : [ f (x), ...recursiveMap (f, xs) ]
 
const square = (x = 0) =>
 x * x
 
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]


Array slice

const identity = x =>
 x
const recursiveMap = (f = identity, xs = []) =>
 xs.length === 0
 ? []
 : [ f (xs[0]), ...recursiveMap (f, xs.slice (1)) ]
 
const square = (x = 0) =>
 x * x
 
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]
 


Additional parameter with default assignment – creates fewer intermediate values

const identity = x =>
 x
const recursiveMap = (f = identity, xs = [], i = 0) =>
 i >= xs.length
 ? []
 : [ f (xs[i]) ] .concat (recursiveMap (f, xs, i + 1))
 
const square = (x = 0) =>
 x * x
 
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]


Cute

const identity = x =>
 x
 
const prepend = x => xs =>
 [ x ] .concat (xs)
 
const compose = (f, g) =>
 x => f (g (x))
const recursiveMap = (f = identity, [ x, ...xs ], then = identity) =>
 x === undefined
 ? then ([])
 : recursiveMap
 ( f
 , xs
 , compose (then, prepend (f (x)))
 )
const square = (x = 0) =>
 x * x
console.log (recursiveMap (square, [ 1, 2, 3, 4, 5 ]))
// [ 1, 4, 9, 16, 25 ]
// => undefined
recursiveMap (square, [ 1, 2, 3, 4, 5 ], console.log)
// [ 1, 4, 9, 16, 25 ]
// => undefined
recursiveMap (square, [ 1, 2, 3, 4, 5 ])
// => [ 1, 4, 9, 16, 25 ]

lang-js

AltStyle によって変換されたページ (->オリジナル) /