javascript 函数式编程遇到的问题,求解答?

最近在学习javascript的函数式编程,采用了ramda这个库。

我的需求是,把数组['1','2']中的每个数字字符串先加1,然后乘2,最后把数组链接成一个字符串,得到结果是‘46’。

我的解决方案是:
(说明下,这个例子比较简单,纯粹是为了了解函数式编程)

var input = ['1', '2'];
var multiple = R.curry((times, b) => parseInt(b) * times + '');
var add = R.curry((count, b) => parseInt(b) + count + '');

var concatArray = function(chars) {
    return chars.reduce(function(a, b) {
            return a.concat(b);
        })
}

var func = R.pipe( add(1), multiple(2) );

var result = concatArray( R.map(func, input) );

console.log(result);

这种方案虽然是work的,但不是函数式的,因为var result = concatArray( R.map(func, input) );这句,concatArray必须要等R.map执行完毕才能执行,也就是这句必须要维持一个中间的状态,但是函数式是不需要维护一个中间的状态的。

所以我想知道这里使用函数式来写的话,应该如何做?

谢谢大家。

阅读 3.3k
3 个回答

先map,再map,再map,最后reduce。

不会 ramda
用纯 js 写了

var input = ["1","2"];

Array.prototype.add = function(x){
    return this.map(function(e){
        return +e+x;
    });
};

Array.prototype.multiple = function(x){
    return this.map(function(e){
        return +e*x;
    });
};

//计算
console.log(
    input
    .add(1)
    .multiple(2)
    .join("")
    );
  1. 数组元素字符串转数字 强制数字转字符串也抽象出一个函数 arr=map((string)=>parsInt(string),array)
  2. 每个数字字符串先加1 arr=map((num)=>num+1,array)
  3. 然后每个数字乘2 arr=map((num)=>num*2,array)
  4. 数组元素转字符串 arr=map((num)=>parsString(num),array)
  5. 数组元素拼接成字符串 string= 这个函数想不起来了

凡是涉及到对象和数组的每个元素的操作 就只有map,filter和reduce方法,想要多的还没有。
函数式编程遵循单一职责原理,每个函数只处理一个问题, 输入后返回结果,由下一个函数操作。
可以用compose和pipel执行操作。注意了这里是数组。 还有函子也可以用,首先把数组包装进函子对象,就可以使用链式操作了。

用Ramda方法做了一个,可能还更简单的方法,ramda文档的 repel调试通过

let getMethod=R.curry((arr1, arr2)=>R.ap(arr1,arr2)); //通用的方法配置
let getNum=getMethod([(str)=>parseInt(str)]);//str 转化

let getAdd=getMethod([R.add(1)]); //数组每个数字加1
let getMultiple=getMethod([R.multiply(2)]);  //数组每个元素乘2
//let getStr=R.curry((num)=>R.toString(num));
let getString=getMethod([R.toString]) //str 转化
let arrJoin=(arr)=>arr.join('');  //字符串拼接
let getResult=R.compose(arrJoin,getString,getMultiple,getAdd,getNum)
getResult([1,2,3,4,5,6,8])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题