如何使用 Ramda 将数组拆分为子列表?

How to split an array into sublists with Ramda?

这是初始状态。

const All = { 
  id : [ "a", "b", "c", "d", "e"],
  count : [1, 2, 2],
}

我想使用 All.count

All.id 分成 [ ["a"], ["b", "c"], ["d", "e"]]

我试过了R.map(R.take(All.count), All.id)。但这是行不通的。

我在这里缺少什么?

您可以使用 R.mapAccum 在当前位置和上一个位置之间分割部分,并在累加器中保留上一个位置。使用 R.last 获取结果数组(第一项是累加器)。

const { pipe, mapAccum, slice, last } = R

const fn = ({ id, count }) => pipe(
  mapAccum((acc, v) => [acc + v, slice(acc, acc + v, id)], 0),
  last
)(count)

const All = { id : [ "a", "b", "c", "d", "e"], count : [1, 2, 2] }

const result = fn(All)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

虽然我确定我们可以用 Ramda 做到这一点,但首先想到的是一个简单的递归调用:

const groups = ([n, ...ns], xs) =>
  n == undefined || xs .length == 0
    ? []
    : [xs .slice (0, n), ... groups (ns, xs .slice (n))]

const All = {id : [ "a", "b", "c", "d", "e"], count : [1, 2, 2]}

console .log (groups (All.count, All.id))

我们只需将第一组从顶部取出,然后递归调用数组的其余部分和较小的计数列表。

我最初用 R .take (n)R .drop (n) 来代替两个 .slice 调用,如果我已经在使用 Ramda,我会那样使用它。但它仍然相当干净。

更新

替代技术可能如下所示:

const groups = (ns, xs) =>
  ns.reduce(({xs, found}, n) => ({
    xs: xs.slice(n), 
    found: [...found, xs.slice(0, n)]
  }), {xs, found: []}).found