我有一个可变长度的数组,该数组的长度大于 3,可以是奇数也可以是偶数。
例如:var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ' j'];
现在我想将该数组分成两半。
['a', 'b', 'c', 'd', 'e']
和 ['f', 'g', 'h', 'i ', 'j']
接下来我想将这些 block 分成两半并继续这样做,直到 block 的长度为 3 或 2。
最后我想将这些 block 存储在一个新数组中。
var newarr = [['a','b','c'],['d','e'],['f','g','h'],[' i','j']];
我该怎么做?
最佳答案
一种 self 暗示的方法是使用递归函数 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 长度 block 之前获得 2 长度 block 。
现在在实践中迭代实现应该比递归实现性能更高,因为它不需要完全创建和放弃小数组,所以如果这预计在大型数组上运行也许应该远离递归。
关于javascript - 如何将数组分成两半,直到达到一定大小的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835296/