我的问题很简单。我最近开始使用Ramda,我喜欢它,因为它是纯函数式的。我对concat函数有一点问题,因为它只接受两个列表作为参数。所以,如果我需要连接三个或更多列表,我必须像这样链接函数:(concat(list1, concat(list2, concat(list3, list4)))
对于四个列表连接)。有没有更好的方法来做到这一点,我不知道?谢谢。
5 回答
如果要连接列表列表,可以使用R.concat
空列表作为初始值来减少列表。
const concatAll = R.reduce(R.concat, []);
concatAll([[1, 2], [3, 4], [5, 6]]);
或者直接将列表传递给R.reduce
.
R.reduce(R.concat, [], [[1, 2], [3, 4], [5, 6]]);
如果你想创建一个新的可变参数函数,将每个列表作为一个单独的参数,那么你可以用R.unapply
.
const concatAll_ = R.unapply(R.reduce(R.concat, []));
concatAll_([1, 2], [3, 4], [5, 6]);
Ramda 还有一个R.unnest
函数,当给定一个列表列表时,它会将它们连接在一起。
R.unnest([[1, 2], [3, 4], [5, 6]]);
我没有使用 Ramda 库,但您似乎在 node.js 中使用了它,我在您发布的链接中阅读了文档。在这种情况下,您可以使用arguments
函数 in 中的变量node.js
来编写您自己的concat
函数,该函数将 n 个列表作为输入。变量本质上arguments
是输入到函数中的参数数组。
function myConcat () {
for (var i = 1; i < arguments.length; i++) {
concat(arguments[0], arguments[i]);
}
return arguments[0];
};
但是,在这种情况下,您可能不得不这样称呼它:
list1 = myConcat(list1, list2, list3, list4);
根据您要连接的内容和您的环境(需要 ES2015),您可以执行以下操作:
const newList = [...list1, ...list2, ...list3];
否则,您会被多次调用 concat 卡住,尽管您可以使用 compose 使其更简洁:
const newList = compose(concat(list1), concat(list2), concat(list4))(list3);
真的,虽然你想映射或更好,减少:
const newList = reduce((acc, x) => concat(acc, x), [list3], [list4, list2, list1]);
或者内部 reduce 函数可能如下所示:
(acc, x) => [...acc, ...x]
使用R.unnest
withR.unapply
允许您将函数调用为可变参数:
const unnestAll = R.unapply(R.unnest)
unnestAll([1, 2], [3, 4], [5, 6, 7]) //=> [1, 2, 3, 4, 5, 6, 7]
斯科特克里斯托弗的回答略有不同
请参阅repl 中的示例
您可以这样使用flatten
方法:
R.flatten([list1, list2, list3, list4, ])
从技术上讲,您传递一个包含所有列表的数组。然后,您只需将它们全部展平为一个数组。
如果您的某些列表本身可能包含列表,请不要使用此方法 - 它们也会被展平。