编写高阶箭头函数

时间:2019-09-11 04:39:56

标签: javascript arrow-functions

我正在执行FreeCodeCamp任务,现在我陷入了Arrow Function的困境 问题是:我需要对数组进行排序(该“过滤器”函数执行得很好-可以排序),但是我的地图却排序了。功能不起作用。我收到一个错误“(((num> 0)&& Number.isInteger(...))。map不是一个函数”

预先感谢

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = (arr) => {
  "use strict";
  const squaredIntegers = arr.filter((num) =>
   (num > 0 && Number.isInteger(num)).map((num) => Math.pow(num,2) )) 
  return squaredIntegers;
};

它应该返回仅包含正整数的平方的数组。

4 个答案:

答案 0 :(得分:3)

.map放在.filter之后

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = (arr) => {
  return arr
    .filter(num => num > 0 && Number.isInteger(num))
    .map(num => num ** 2)
};

console.log(squareList(realNumberArray));

答案 1 :(得分:1)

您可以一起完成所有操作,而无需使用return或将其设置为另一个const:

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const squareList = (arr) => arr.filter(num => num > 0 && 
   Number.isInteger(num)).map(num => Math.pow(num,2));

答案 2 :(得分:0)

您只能使用reduce函数来完成此操作。

const list = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const result = list.reduce((acc, val) => {
  if (Number.isInteger(val) && val > 0) {acc.push(val*val)};
  return acc;
}, []);
console.log(result);

答案 3 :(得分:0)

但是您说过高阶箭头功能 ^ _ ^

const squareList = arr =>
  $ (arr)                        // beginning with arr,
    (filter (num => num > 0))    // filter
    (filter (Number.isInteger))  // filter some more
    (map (x => x ** 2))          // map
    ($)                          // extract result

const map = f => xs =>
  xs .map (x => f (x))           // Array.prototype.map
  
const filter = f => xs =>
  xs .filter (x => f (x))        // Array.prototype.filter

const $ = x =>      // beginning with x,
  f =>              // and a function, f,
    f === $         // exit condition
      ? x           // return x
      : $ (f (x))   // otherwise, transform x using f and recur

const realNumbers =
  [ 4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2 ]
  
const result =
  squareList (realNumbers)

console.log(result)
// [ 16, 1764, 36 ]

诸如$之类的功能使我们能够以不同的方式思考问题。在上方,我们看到squareList接受一个数组并将其垂直向下传递到“管道”中。直观上,将问题视为arr->filter->filter->map的序列会很好,但这是浪费的计算。正如其他人指出的那样,可以使用单个reduce完成此操作。如果我们也可以吃蛋糕也可以吃吗?

功能编程就是关于功能编程的全部内容。这并不意味着我们不必以特定方式放弃编写程序。只需编写函数即可隔离复杂性并为您完成艰苦的工作。

下面,squareList与上面的完全相同,但是这次我们通过重构$来显着改变程序的行为。此版本不是按顺序运行filter->filter->map,而是构建一个待处理的计算并在弹出该值时运行单个reduce。这项技术的通俗名称是 transducers ;在这里,我已经使用箭头功能对它们进行了编码。

几天的高阶箭头功能^ _ ^

const squareList = arr =>
  $ (arr)                       // beginning with arr,
    (filter (num => num > 0))   // add filter transducer
    (filter (Number.isInteger)) // add another filter transducer
    (map (x => x ** 2))         // add map transducer
    ($)                         // run transducer

const map = f =>                   // map transducer
  k => (r, x) => k (r, f (x))
  
const filter = f =>                // filter transducer
  k => (r, x) => f (x) ? k (r, x) : r

const $ = (x, t = identity) =>     // beginning with x and base transducer,
  f =>                             // and a function, f,
    f === $                        // exit condition
      ? x .reduce (t (push), [])   // run transducer; single reduce
      : $ (x, comp (t, f))         // otherwise, recur with new transducer

const identity = x =>
  x

const push = (r, x) =>
  ( r .push (x)
  , r
  )

const comp = (f, g) =>
  x => f (g (x))

const realNumbers =
  [ 4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2 ]
  
const result =
  squareList (realNumbers)

console.log(result)
// [ 16, 1764, 36 ]

$上方仅迭代一次输入数组 ,而在filter->filter->map之上迭代{3重复三次(3)次。在arr很大的情况下,这是很大的性能提升。

$可以是任何东西 –由于它是一个函数,它为我们提供了一个可以控制并进行有意义的更改的域;也许我们进行了一些性能优化;如果给出了无效的参数,可能会抛出TypeError;也许我们称其为pipe或称其为trans或其他名称。不要陷入功能编程在Array.prototype.mapArray.prototype.filterArray.prototype.reduce等处开始思考的麻烦。 想象一下魔术棒,然后 you 创建它^ _ ^