9

我的问题很简单。我最近开始使用Ramda,我喜欢它,因为它是纯函数式的。我对concat函数有一点问题,因为它只接受两个列表作为参数。所以,如果我需要连接三个或更多列表,我必须像这样链接函数:(concat(list1, concat(list2, concat(list3, list4)))对于四个列表连接)。有没有更好的方法来做到这一点,我不知道?谢谢。

4

5 回答 5

19

如果要连接列表列表,可以使用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]]);
于 2015-12-20T00:02:58.980 回答
1

我没有使用 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);
于 2015-12-19T23:04:57.053 回答
1

根据您要连接的内容和您的环境(需要 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]
于 2015-12-19T23:48:33.367 回答
1

使用R.unnestwithR.unapply允许您将函数调用为可变参数:

const unnestAll = R.unapply(R.unnest)
unnestAll([1, 2], [3, 4], [5, 6, 7]) //=> [1, 2, 3, 4, 5, 6, 7]

斯科特克里斯托弗的回答略有不同

请参阅repl 中的示例

于 2018-06-04T18:19:06.673 回答
1

您可以这样使用flatten方法:

R.flatten([list1, list2, list3, list4, ])

从技术上讲,您传递一个包含所有列表的数组。然后,您只需将它们全部展平为一个数组。

如果您的某些列表本身可能包含列表,请不要使用此方法 - 它们也会被展平。

于 2018-12-18T15:20:21.590 回答