当 lodash 有余数时,如何将已排序的数组排序为列?
Posted
技术标签:
【中文标题】当 lodash 有余数时,如何将已排序的数组排序为列?【英文标题】:How to order a sorted array into columns when there are remainders with lodash? 【发布时间】:2018-08-23 16:06:39 【问题描述】:我有一个按字母顺序排列的值数组:
const arr = ['abcdefghijkl'].split('');
我想按字母顺序按 1 个平面集合中的列获取字母的顺序。
例如3
cols:
['a','e','i',
'b','f','j',
'c','g','k',
'd','h','l']
我们可以使用 lodash 之类的 fp lib 轻松做到这一点:
const arr = 'abcdefghijkl'.split('');
function orderByCols(a, cols)
return flatten(zip(...chunk(a, (a.length/cols))))
let output = orderByCols(arr, 3);
直播代码: https://stackblitz.com/edit/order-by-cols
当我们对数组进行分块并且有余数时,问题就出现了:
const remainderArr = ['abcdefghijklm'].split(''); // added 'm'
这会让一切变得混乱。
预期的输出如下所示:
['a','f','j',
'b','g','k',
'c','h','l',
'd','i','m',
'e']
问题:对于有余数的集合,我该如何处理这种情况?我的方法完全关闭了吗?
【问题讨论】:
只有 lodash 解决方案? 当然不是。但只是试图弯曲 lib 以进行锻炼 【参考方案1】:我认为你有一个错误
Math.ceil(a.length/cols)
我假设您的预期形状不正确 - 因为您正在执行列优先排序,所以您真的应该期待这个解决方案:
['a','f','k',
'b','g','l',
'c','h','m',
'd','i',,
'e','j',,]
(Math.ceil
将为您提供)。
无论哪种方式,您都需要天花板来固定二维阵列的最终形状。您的代码中存在实际错误。
如果您的预期结果没有关闭,并且您实际上是在寻找字符串“中间”的“溢出”,那么您的问题没有优雅的解决方案 - 您必须手动找出先溢出,然后在删除字符串的那部分后使用优雅的解决方案
【讨论】:
Math.ceil() 将有助于删除空值等,但我预期的形状并没有关闭。 >_ 看起来像 github.com/lodash/lodash/issues/2641 最后的评论是在谈论我正在尝试做的事情,kerrik 使用分区函数将其称为“columnize”......但它现在不起作用。跨度> 你正在做列 - 首先为字符串排序,所以你期望的形状是关闭的。使用这种排序,更自然的形状将在第二列的最底行而不是第三列的顶部有j
- 并且Math.ceil()
修复了该形状。我真的不明白为什么要让中间字符串字符像你预期的答案那样溢出——这非常不自然(而且不太可能!)——但如果这是你想要的,那么就没有优雅的解决方案以上是关于当 lodash 有余数时,如何将已排序的数组排序为列?的主要内容,如果未能解决你的问题,请参考以下文章
javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan