我遇到了一個問題。

一個數組包含了很多項目,我想將它分成多個部分。

我想出了兩種完全不同的解決方案。

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 ] 
]