JavaScript实现数组降维详解
二维数组降维
二维数组只有两个维度,降维比较简单,也不用考虑太复杂的算法逻辑,我们看一下二维数组降维的几种方法;
遍历降维
vararr=[ ['h','e','l','l','o'], ['m','y'], ['w','o','r','l','d'], ['!'] ]; varresult=[]; for(varr=0;r<arr.length;r++){ for(varc=0;c<arr[r].length;c++){ result.push(arr[r][c]); } } console.log(result);//=>['h','e','l','l','o','m','y','w','o','r','l','d','!']
此方法思路简单,利用双重循环遍历二维数组中的每个元素并放到新数组中。
使用concat
利用concat方法,可以将双重循环简化为单重循环:
vararr=[ ['h','e','l','l','o'], ['m','y'], ['w','o','r','l','d'], ['!'] ]; varresult=[]; for(varr=0,result=[];r<arr.length;r++){ result=result.concat(arr[r]); } console.log(result);//=>['h','e','l','l','o','m','y','w','o','r','l','d','!']
arr的每一个元素都是一个数组或参数,作为concat方法的参数,数组中的参数或每一个子元素又都会被独立插入进新数组。
使用apply+concat
apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;
vararr=[ ['h','e','l','l','o'], ['m','y'], ['w','o','r','l','d'], ['!'] ]; varresult=Array.prototype.concat.apply([],arr); console.log(result);//=>['h','e','l','l','o','m','y','w','o','r','l','d','!']
利用apply方法,只需要一行代码就可以完成二维数组降维了。
多维数组降维
多维数组就没二维数组那么简单了,因为不确定数组的深度,所以也不能进行遍历来降维,只能通过递归或者栈方法来实现。
递归
Array.prototype.deepFlatten=function(){ varresult=[];//定义保存结果的数组 this.forEach(function(val,idx){//遍历数组 if(Array.isArray(val)){//判断是否为子数组 val.forEach(arguments.callee);//为子数组则递归执行 }else{ result.push(val);//不为子数组则将值存入结果数组中 } }); returnresult;//返回result数组 } vararr=[2,3,[2,2], [3,'f',['w',3]],{"name":'Tom'} ]; console.log(arr.deepFlatten());//=>[2,3,2,2,3,'f','w',3,{name:'Tom'}]
这是通过递归的方法实现了多维数组的降维,在这里面,我有使用了原型链将方法封装进了Array原型中,可以直接在数组方法中调用。
栈方法
Array.prototype.deepFlatten=function(){ varresult=[];//定义保存结果的数组 varstack=this;//将数组放入栈中 while(stack.length!==0){//如果栈不为空,则循环遍历 varval=stack.pop();//取出最后一个值 if(Array.isArray(val)){//判断是不是数组 stack=stack.concat(val);//如果是数组就将拼接入栈中 }else{ result.unshift(val);//如果不是数组就将其取出来放入结果数组中 } } returnresult; } vararr=[2,3,[2,2], [3,'f',['w',3]],{"name":'Tom'} ]; console.log(arr.deepFlatten());//=>[2,3,2,2,3,'f','w',3,{name:'Tom'}]
这是通过栈方法,建立了一个栈,将数组的内容存进去,然后逐个取出来,如果取出来的是个数组,就将这个数组打散拼接进栈中,在出栈一个,这样循环。
多维数组降维的方法也可以降维二维数组,但是有点大材小用,还是用对的方法做对的事才是最好的!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。