我在javascript函数参数中使用了这个三元运算符,我似乎真的不知道它是如何使用的,以及函数(Fn)是如何被调用的。
我的理解是,fn的类型计算为true,然后我们使用fn函数,但是要做什么呢?
我真的不明白。
我试着通读了所有可用的材料,但似乎不理解我们是如何将val=> valfn
const countBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
console.log(countBy([6, 10, 100, 10], Math.sqrt));
发布于 2019-09-19 18:00:27
这表示如果fn
是使用fn
的函数,则使用val => val[fn]
typeof fn === 'function' ? fn : val => val[fn]
我看到的一个用例是使用相同的函数对具有数字的数组或具有一些键名的对象数组执行一些算术运算,
const countBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
console.log(countBy([6, 10, 100, 10], Math.sqrt));
console.log(countBy([{b:6}, {b:10}, {b:100}, {b:10}], 'b'));
发布于 2019-09-19 17:51:18
数组map()接受一个函数。三元组用于确定要运行的函数。代码指出,如果fn
是一个函数,则将其用作函数,如果不是,则使用其他函数,并将其用作键。
代码可以重写为
const countBy = (arr, fn) => {
let mapped
if (typeof fn === 'function') {
mapped = arr.map(fn)
} else {
mapped = arr.map(val => val[fn])
}
return mapped.reduce((acc, val, i) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
}
这里的问题是变量fn非常不清楚它是什么。有人重载了函数,并且没有使用正确的变量名。就我个人而言,我会把它变成一个物体。
const countBy = (arr, options) =>
arr.map(options.processFunction ? options.processFunction : val => val[options.objectProperty]).reduce((acc, val, i) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
console.log(countBy([6, 10, 100, 10], {
processFunction: Math.sqrt
}));
const receipt = [{
total: 6
}, {
total: 10
}, {
total: 100
}, {
total: 10
}]
console.log(countBy(receipt, {
objectProperty: 'total'
}));
发布于 2019-09-19 17:48:01
val
-包含函数的对象。您可以使用map
将function:myObject['myFunction']
应用到每个元素。
myObject['myFunction']
等于myObject.myFunction
https://stackoverflow.com/questions/58016435
复制