我有一組不同大小的陣列。目標是生成“行”,其中每行最多可以包含 12 個元素。例如:
輸入資料可以是這樣的:
const groups = [[1,2,3,4],[1,2,3,4,5,6], [1,2,3,4,5,6,7,8,9,10,11,12], [1,2,3,4,5,6,7], [1,2,3],[1,2,3]]
groups[0].length groups[1].length = 10 -> row0
groups[2].length = 12 -> row1
groups[3].length groups[4].length = 10 -> row3
groups[5].length = 3 -> row4
這種陣列的輸出應該是:
[[[1,2,3,4], [1,2,3,4,5,6]], [[1,2,3,4,5,6,7,8,9,10,11,12]], [[1,2,3,4,5,6,7], [1,2,3]], [[1,2,3]]]
我正在為此考慮一個遞回函式,但不知道如何解決它。
uj5u.com熱心網友回復:
您可以使用它Array#reduce()來執行此操作。如果添加下一個組,代碼首先檢查當前最后一個元素(最后一個“行”)是否包含超過 12 個數字:
(acc[acc.length - 1].flat().length cv.length) <= 12
如果小于 12,元素將被推入“行”:
acc[acc.length - 1].push(cv)
如果沒有,將在外部陣列中添加一個新的“行”:
acc.push([cv])
const groups = [[1, 2, 3, 4],[1, 2, 3, 4, 5, 6],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5, 6, 7],[1, 2, 3],[1, 2, 3]];
const rows = groups.reduce((acc, cv) => {
(acc[acc.length - 1].flat().length cv.length) <= 12 ?
acc[acc.length - 1].push(cv) :
acc.push([cv])
return acc
}, [[]]);
console.log(JSON.stringify(rows))
uj5u.com熱心網友回復:
這是遞回解決它的一種方法:
const regroup = (max, [g, ...gs], filled = [], curr = [], cc = 0) =>
g == undefined
? filled .concat ([curr])
: g .length cc <= max
? regroup (max, gs, filled, curr .concat ([g]), cc g.length)
: regroup (max, gs, filled .concat ([curr]), [g], g .length)
const groups = [[1, 2, 3, 4], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[1, 2, 3, 4, 5, 6, 7], [1, 2, 3], [1, 2, 3]]
console .log (regroup (12, groups))
.as-console-wrapper {max-height: 100% !important; top: 0}
我們傳遞最大尺寸和專案串列,然后我們默認三個引數:
filled將跟蹤我們填充的輸出行;它從一個空陣列開始curr存盤我們正在處理的行;它也以一個空陣列開頭cc存盤當前行中所有元素的計數;它從零開始
在每個遞回呼叫中,我們有以下三種可能性之一:
- 沒有更多要處理的陣列,我們回傳所有已填充的行,并附加當前行。
- 下一個陣列足夠小以適合當前行,我們更新當前以包含它,并更新當前計數以容納它。
- 下一個陣列太大了,我們將現有的當前行添加到填充的行中,并用這個陣列開始一個新的當前行,適當地設定計數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/435106.html
標籤:javascript 数组 递归
下一篇:計算e^x時出現運行時錯誤
