“功能性”生成仅包含少量元素的列表

时间:2013-10-18 09:36:41

标签: javascript functional-programming

这纯粹是一种练习,但考虑到这段代码:

var someCondition = (....);
var res = [];
if (someCondition) {
   res.push("A");
}
res.push("B");
if (someCondition) {
   res.push("C")
}
return res;

表达清单的更具“功能性”的方式是什么?

我可能会像(在JS中,下划线减少,基本上是折叠)

_.reduce(["A", "B", "C"], function (memo, value, index) {
     if (index === 0 || index === 2) {
        if (someCondition) {
           memo.push(value);
        }
     } else {
        memo.push(value);
     }
}, []);

或使用过滤器:

_.filter(["A", "B", "C"], function (value, index) {
    if (index === 0 || index === 2) {
       return someCondition;
    } else {
       return true;
    }
});

现在,这听起来有点难看......我在这里错过了一个明显的解决方案吗?

3 个答案:

答案 0 :(得分:0)

filter怎么样?

_.filter(['A', 'B', 'C'], function(value, index){
    if (index === 1 || index === 2) {
        return someCondition;
    }
    return true;
});

答案 1 :(得分:0)

就个人而言,我不会将此视为过滤函数的候选者,因为数组索引很重要。 对我来说,第一个功能方法是这样的:

[].concat(someCondition ? ['A'] : [],
          ['B'],
          someCondition ? ['C'] : []);

这里的优点是与特定指数的分离以及更容易插入其他项目的能力。

答案 2 :(得分:0)

表达您想要做的事情的方法是使用filter

说你有条件:

function isEven(n) {
  return n % 2 === 0;
}

以及从020的数字列表,包括:

const A = [...Array(21).keys()];

如果您想要该列表中的偶数,您可以这样做:

A.filter((n) => isEven(n));

同样,如果你想要奇怪的那些:

A.filter((n) => isOdd(n));

重要的是,也许是Functional Programming最重要的一点,就是该过程中数组A 未被修改:该函数只是简单地获取并返回数据每次发送的数据相同时,函数调用的结果都是相同的。没有国家管理,没有副作用。