我有一个变量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
接受一个函数和一个值(f
和x
)。它调用IIFE来确定该值是否x
已实现map
方法。如果是这样,它将把该map
方法绑定到该值。如果该值未实现map
方法,则它将创建一个匿名函数,该函数将接受另一个函数,并使用value调用该另一个函数x
。
最后,它返回计算结果。
进一步的想法
老实说,我个人的看法是使用条件!这更容易理解和推理。无论如何,它可以在没有条件语句或三元运算符的情况下执行。
慕田峪4524236
TA贡献1875条经验 获得超5个赞
您可以添加其他尺寸并使用.flat()
它来摆脱它
[5].flat() // [5] [[5]].flat() // [5]
这样,您可以编写:
[data].flat().map(f);
但这是没有意义的,只是浪费了计算时间。有条件的应该在这里更快。
尝试使输入保持一致,并始终将数组传递到该位置(即使使用单个元素也是如此)。
添加回答
举报
0/150
提交
取消