首页 > 解决方案 > 处理可以是数组或单个值的数据,没有条件

问题描述

我有一个变量data,它可以是单个值(假设它可以是对象、字符串或数字)或数组。我想对数组的每个元素或单个值执行一个函数。目前,我有:

let result;
if (Array.isArray(data)) {
   result = data.map(d => f(d))
} else {
   result = f(data);
}

我可以使用三元来达到同样的效果,但我想删除条件。有没有一种惯用的方式来做到这一点?

标签: javascript

解决方案


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'));

怎么回事??

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

最后,它返回计算结果。

进一步的想法

老实说,我个人的意见是使用条件!它更容易理解和推理。无论如何,没有条件语句或三元运算符也是可行的。


推荐阅读