我遇到了一個問題。
一個數組包含了很多項目,我想將它分成多個部分。
我想出了兩種完全不同的解決方案。
A)第一種是將數組平均分成多個部分,例如每個部分有2或3個項目 B)第二種是創建n個部分並為其添加相等的變量集合項目
不同的是我們分割的方法和原因。解決方案(A)在你不知道最後會得到多少組時很好用,而且你並不關心,但你知道你想要每個新數組中有X個項目。
解決方案(B)在你知道你想要創建多少組並且對此要求嚴格時很好用,但你並不關心每個新數組的項目數量。
換句話說,對於一個數組
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
使用方案(A),我們可以創建2個項目的部分,得到
[ 1, 2 ]
[ 3, 4 ]
[ 5, 6 ]
[ 7, 8 ]
[ 9, 10 ]
或者3個項目的部分:
[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
[ 10 ]
使用方案(B),我們可以將數組分成2個部分,得到:
[ 1, 2, 3, 4, 5 ]
[ 6, 7, 8, 9, 10 ]
或者分成3個部分,得到:
[ 1, 2, 3, 4 ]
[ 4, 5, 6, 7]
[ 8, 9, 10 ]
這是方案(A)的實現:
const items = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //… 你的數組,填充了值
const n = 3 //調整此值以增加每行的項目數
const result = new Array(Math.ceil(items.length / n))
.fill()
.map(\_ => items.splice(0, n))
在這個例子中,result
是一個新的數組的數組:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ],
[ 10 ]
]
注意,使用splice()
方法會修改原始數組。
這是方案(B)的實現,假設你想要一個包含3個數組的數組作為結果:
const items = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //… 你的數組,填充了值
const n = 3
const result = [[], [], []] //我們創建一個數組,然後填充它
const wordsPerLine = Math.ceil(items.length / 3)
for (let line = 0; line < n; line++) {
for (let i = 0; i < wordsPerLine; i++) {
const value = items[i + line \* wordsPerLine]
if (!value) continue //避免添加“undefined”值
result[line].push(value)
}
}
在這個例子中,result
是:
[
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10 ]
]