这纯粹是一种练习,但考虑到这段代码:
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;
}
});
现在,这听起来有点难看......我在这里错过了一个明显的解决方案吗?
答案 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;
}
以及从0
到20
的数字列表,包括:
const A = [...Array(21).keys()];
如果您想要该列表中的偶数,您可以这样做:
A.filter((n) => isEven(n));
同样,如果你想要奇怪的那些:
A.filter((n) => isOdd(n));
重要的是,也许是Functional Programming最重要的一点,就是该过程中数组A
未被修改:该函数只是简单地获取并返回数据每次发送的数据相同时,函数调用的结果都是相同的。没有国家管理,没有副作用。