我正在执行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;
};
它应该返回仅包含正整数的平方的数组。
答案 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.map
,Array.prototype.filter
,Array.prototype.reduce
等处开始思考的麻烦。 您想象一下魔术棒,然后 you 创建它^ _ ^