Javascript 我不明白三元运算符是如何工作的,以及在这个数组映射方法中我们是如何调用函数的

Javascript 我不明白三元运算符是如何工作的,以及在这个数组映射方法中我们是如何调用函数的,javascript,Javascript,我在javascript函数参数中使用这个三元运算符,但我似乎真的不知道它是如何使用的,以及函数(fn)是如何调用的 我的理解是,fn的类型计算为真,然后我们使用fn函数,但做什么 我真的不明白 我试图通读所有可用的资料,但似乎不明白我们是如何翻val=>val[fn] const countBy = (arr, fn) => arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) =&

我在javascript函数参数中使用这个三元运算符,但我似乎真的不知道它是如何使用的,以及函数(fn)是如何调用的

我的理解是,fn的类型计算为真,然后我们使用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));

val
-是包含函数的对象。您将获得函数:
myObject['myFunction']
,该函数使用
map
应用于每个元素


myObject['myFunction']
等于
myObject.myFunction
Array.map
将函数作为参数。该函数由
map
为数组中的每个项调用。因此,当您返回
fn
时,您告诉
map
为每个元素运行
fn(项)
。然后,Map返回一个包含每次调用结果的新数组。

array 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,选项)=>
arr.map(options.processFunction?options.processFunction:val=>val[options.objectProperty]).reduce((acc,val,i)=>{
acc[val]=(acc[val]| 0)+1;
返回acc;
}, {});
console.log(countBy([6,10,100,10]{
processFunction:Math.sqrt
}));
常量收据=[{
总数:6
}, {
总数:10
}, {
总数:100
}, {
总数:10
}]
控制台日志(计数方式(接收){
objectProperty:“总计”

}));
这表示如果
fn
是函数use
fn
use
val=>val[fn]

typeof fn === 'function' ? fn : val => val[fn]
我看到的一个用例是使用同一个函数One对具有数字的数组或具有一些键名的对象数组进行运算

const countBy=(arr,fn)=>
arr.map(typeof fn==“function”?fn:val=>val[fn])。reduce((acc,val,i)=>{
acc[val]=(acc[val]| 0)+1;
返回acc;
}, {});
log(countBy([6,10100,10],Math.sqrt));

log(countBy([{b:6},{b:10},{b:100},{b:10}],'b')在正常工作环境中,该代码总体上被认为是可读的吗?对我来说是可读的。需要评论才能弄清楚到底发生了什么。