当 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 有余数时,如何将已排序的数组排序为列?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 lodash 和 vueJS 对数组进行排序

Vue.js 内联编辑组件在保存前按 lodash 排序

javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan

在 ReactJS 上使用 Lodash 对映射列表进行排序

Lodash常用函数

算法——排序——插入排序——希尔排序