javascript - 使用 Ramda 从多个数组中循环获取前 X 个项目
问题描述
我有一个数组数组,并想编写一个函数x
,通过按顺序从每个数组中获取项目,返回最高项目数。
这是我所追求的一个例子:
const input = [
["1a", "2a", "3a", "4a", "5a"],
["1b", "2b", "3b", "4b", "5b"],
["1c", "2c", "3c", "4c", "5c"],
["1d", "2d", "3d", "4d", "5d"]
];
const takeRoundRobin = count => arr => {
// implementation here
};
const actual = takeRoundRobin(5)(input);
const expected = [
"1a", "1b", "1c", "1d", "2a"
];
我看到了一个对 Scala 问题的建议,该问题使用解决了这个问题,zip
但在 Ramda 中,您只能将 2 个列表传递给 zip。
解决方案
在这里,Ramda'stranspose
可以成为您的基地。添加一团unnest
,一点take
,你会得到:
const {take, unnest, transpose} = R
const takeRoundRobin = (n) => (vals) => take(n, unnest(transpose(vals)))
const input = [
['1a', '2a', '3a', '4a', '5a'],
['1b', '2b', '3b', '4b', '5b'],
['1c', '2c', '3c', '4c', '5c'],
['1d', '2d', '3d', '4d', '5d']
]
console.log(takeRoundRobin(5)(input))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
另请注意,这可以处理不同长度的数组:
如果您希望能够回到开头并继续取值,您可以take
用recursiveTake
这样的替换:
const {take, unnest, transpose, concat } = R
//recursive take
const recursiveTake = (n) => (vals) => {
const recur = (n,vals,result) =>
(n<=0)
? result
: recur(n-vals.length,vals,result.concat(take(n,vals)))
return recur(n,vals,[]);
};
const takeRoundRobin = (n) => (vals) =>
recursiveTake(n)(unnest(transpose(vals)));
const input = [
['1a', '2a', '3a', '4a'],
['1b'],
['1c', '2c', '3c', '4c', '5c'],
['1d', '2d']
]
console.log(takeRoundRobin(14)(input))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
该函数的另一个版本,没有显式递归,如下所示:
const takeCyclic = (n) => (vals) => take(
n,
unnest(times(always(vals), Math.ceil(n / (vals.length || 1))))
)
推荐阅读
- vmware-clarity - VMWare Clarity - 主分支 - `npm run angular:dev:start` 失败并出现错误:找不到任务:“'core:build:ts”
- oauth-2.0 - 我应该在我的应用程序中使用哪种 OAuth 流程来集成 Google Drive?
- php - Laravel 获取所有类别的帖子数
- authentication - DocuSign API:信封身份验证查看 URL 的重定向问题
- css - CSS Media Query Level 4 Range Context Syntax——没有在 Chromium 中实现?
- php - 如何在 Order Meta 中获取产品名称
- google-sheets - 如何阻止 Google 表格在空白单元格中显示撇号?
- python - 运行 PyQt 代码不会打开窗口
- google-api - 用户使用参数描述中的“最后一次交互”是什么意思
- android - NativeScript android原生库实现