javascript数组降维_JavaScript实现数组降维详解

二维数组降维

二维数组只有两个维度,降维比较简单,也不用考虑太复杂的算法逻辑,我们看一下二维数组降维的几种方法;

遍历降维

var arr = [

['h', 'e', 'l', 'l', 'o'],

['m', 'y'],

['w', 'o', 'r', 'l', 'd'],

['!']

];

var result = [];

for (var r = 0; r < arr.length; r++) {

for (var c = 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方法,可以将双重循环简化为单重循环:

var arr = [

['h', 'e', 'l', 'l', 'o'],

['m', 'y'],

['w', 'o', 'r', 'l', 'd'],

['!']

];

var result = [];

for (var r = 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值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;

var arr = [

['h', 'e', 'l', 'l', 'o'],

['m', 'y'],

['w', 'o', 'r', 'l', 'd'],

['!']

];

var result = 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() {

var result = []; //定义保存结果的数组

this.forEach(function(val, idx) { //遍历数组

if (Array.isArray(val)) { //判断是否为子数组

val.forEach(arguments.callee); //为子数组则递归执行

} else {

result.push(val); //不为子数组则将值存入结果数组中

}

});

return result; //返回result数组

}

var arr = [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() {

var result = []; //定义保存结果的数组

var stack = this; //将数组放入栈中

while (stack.length !== 0) { //如果栈不为空,则循环遍历

var val = stack.pop(); //取出最后一个值

if (Array.isArray(val)) { //判断是不是数组

stack = stack.concat(val); //如果是数组就将拼接入栈中

} else {

result.unshift(val); //如果不是数组就将其取出来放入结果数组中

}

}

return result;

}

var arr = [2, 3, [2, 2],

[3, 'f', ['w', 3]], { "name": 'Tom' }

];

console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过栈方法,建立了一个栈,将数组的内容存进去,然后逐个取出来,如果取出来的是个数组,就将这个数组打散拼接进栈中,在出栈一个,这样循环。

多维数组降维的方法也可以降维二维数组,但是有点大材小用,还是用对的方法做对的事才是最好的!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值