如何使用 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
这是初始状态。
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