如何将数组分成两半直到达到一定大小的块?

时间:2014-04-03 10:50:54

标签: javascript arrays algorithm

我有一个变量长度大于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']];

我该怎么做?

2 个答案:

答案 0 :(得分:4)

自我建议的方法是使用递归函数F:对于输入数组arr,如果其长度为< = 3,则结果为[arr],否则为{ {1}}与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)))); } 来电,但如果您这样做,您将在结果中的3长度之前获得2长度的数据块。

现在在实践中迭代实现应该比递归实现更高效,因为它不需要完全创建和放弃小数组,所以如果预期它会在大型数据上运行数组你应该远离递归。

答案 1 :(得分:0)

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
}

如果你不认为这个答案已经足够好了(对我以外的任何人都没有意义,我现在很累)请只是评论而不是讨厌。