我有一个变量长度大于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']];
我该怎么做?
答案 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
}
如果你不认为这个答案已经足够好了(对我以外的任何人都没有意义,我现在很累)请只是评论而不是讨厌。