[英]How to split an array in half until chunks of a certain size are reached?
我有一個可變長度大於3的數組,可以是奇數或偶數。
例如: var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
現在,我想將該數組分成兩半。
['a', 'b', 'c', 'd', 'e']
和['f', 'g', 'h', 'i', 'j']
接下來,我想將這些塊分割成兩半,並繼續這樣做,直到塊的長度為3或2。
最后,我想將這些塊存儲在新數組中。
var newarr = [['a','b','c'],['d','e'],['f','g','h'],['i','j']];
我該怎么做?
一種自暗示的方式來做到這一點是利用一個遞歸函數F:用於將輸入陣列arr
如果其長度為<= 3則結果為[arr]
否則是F(first_half_of_arr)
與級聯F(second_half_of_arr)
在代碼中,它轉換為:
function recursiveSplit(arr) {
return arr.length <= 3 ? [arr] :
recursiveSplit(arr.slice(0, Math.ceil(arr.length / 2)))
.concat(recursiveSplit(arr.slice(Math.ceil(arr.length / 2))));
}
您可以排除Math.ceil
調用,但是如果這樣做,您將在結果中獲得3個長度的塊之前得到2個長度的塊。
現在, 在實踐中 ,迭代實現應該比遞歸實現更具性能,因為它不需要完全創建和放棄小的數組,因此,如果期望這種方法可以在大數組上運行,則您可能應該避免遞歸。
var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
var arr1 = arr.splice(0, Math.ceil(arr.length / 2));
那將把一個數組分成兩半,所以現在arr包含原始數組的后一半,而arr1包含前一半。
您應該能夠在while循環中重復:
while (arr > 3) {
//continue splicing
}
如果您認為這個答案不夠好(對我以外的任何人來說都沒有意義,我現在很累),請發表評論而不是討厭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.