请教,一维数组整理成二维数组如何编写代码更为优雅?

因项目需要,现有一维数组需要重新按每10个元素为一个数组整理成二维数组.
例如,把arr1重新整理为arr2

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
var arr2 = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

我目前想到的做法如下:

let arr = [];
let arr2 = [];
for(let i = 0,len = arr1.length; i < len; i++){
    arr.push(arr1[i]);
    if(i && i % 9 == 0){
        arr2.push(arr);
        arr = [];
        continue;
    }
    if(i == len - 1) arr2.push(arr);
}

不知是否有更为优雅的写法和思路?

阅读 4.8k
10 个回答
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
var copy = [...arr]
var result = []

while(copy.length) {
  result.push(copy.splice(0,10))
}

两种方式:

let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
let arr2 = [];
for(let i = 0; i < Math.ceil(arr1.length / 10); i++) {
    arr2.push(arr1.slice(i * 10, i * 10 + 10));
}
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
let arr2 = [];
while(arr1.length > 0) {
    arr2.push(arr1.splice(0, 10));
}

let arr = [];
let arr2 = [];
for(let i = 0,j=0; i < arr.length; i++){

(j+1)*10 === i && j++
arr2[j].push(arr[i]);

}
瞎写的

用slice或者splice

用slice创建副本的方式代替循环push操作

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
var arr2 = [];
while(arr1.length){

arr2.push(arr1.splice(0,10))

}

弊端:arr1被修改,看需求如果需要保留arr1 可先创建一个副本

 function arrnum(arr,num){
             var myarr = [];
             for(var i=0;i<arr.length;i+=num){
                myarr.push(arr.slice(i,num+i));
             }
            return myarr;
         }  
        var arr2 = arrnum(arr1,10);
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
var arr2 = [];
for(var i = 0;i < arr1.length / 10;i++)
    arr2.push(arr1.slice(10*i,10*(i+1)))
console.log(arr2)

lodash一行搞定,没有比这更优雅的了:

var arr2 = _.chunk([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 10);
var arr2 = arr1.reduce((a,b)=>(a[(b-1)/10>>0]=[...(a[(b-1)/10>>0] || []), b], a), [])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题