为了账号安全,请及时绑定邮箱和手机立即绑定

在没有条件的情况下处理可能是数组或单个值的数据

在没有条件的情况下处理可能是数组或单个值的数据

慕码人8056858 2021-04-19 16:41:10
我有一个变量data,它可以是单个值(假设它可以是对象,字符串或数字)或数组。我想在数组的每个元素或单个值上执行一个函数。目前,我有:let result;if (Array.isArray(data)) {   result = data.map(d => f(d))} else {   result = f(data);}我可以使用三元函数来达到相同的效果,但是我想删除条件函数。是否有惯用的方法?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您可以在此示例中使用“看起来function很神秘” fmap(尽管名称并不正确):


function fmap (f, x) {

  return (function (g) {

    return g(f);

  })((x && x.map && x.map.bind(x)) || function (h) { return h(x); });

}


const upper = x => x.toUpperCase();


console.log('fmap over array:', fmap(upper, ['a', 'b', 'c']));

console.log('fmap over string:', fmap(upper, 'a'));

WTF ??

fmap接受一个函数和一个值(fx)。它调用IIFE来确定该值是否x已实现map方法。如果是这样,它将把该map方法绑定到该值。如果该值未实现map方法,则它将创建一个匿名函数,该函数将接受另一个函数,并使用value调用该另一个函数x

最后,它返回计算结果。

进一步的想法

老实说,我个人的看法是使用条件!这更容易理解和推理。无论如何,它可以在没有条件语句或三元运算符的情况下执行。


查看完整回答
反对 回复 2021-04-29
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

您可以添加其他尺寸并使用.flat()它来摆脱它

[5].flat() // [5]
[[5]].flat() // [5]

这样,您可以编写:

[data].flat().map(f);

但这是没有意义的,只是浪费了计算时间。有条件的应该在这里更快。

尝试使输入保持一致,并始终将数组传递到该位置(即使使用单个元素也是如此)。



查看完整回答
反对 回复 2021-04-29
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信