Javascript之数组降维

数组降维,虽然平时项目开发我们不常用到,但还是作为一个知识点记录一下,降维思想还是挺重要的

首先,最简单的纯数字或者字符串格式的二维数组,[1,2,3,4,[5,6],7,8],

//第一种,利用数组字符串互转
var arr = [1,2,3,4,[5,6],7,8];
var newArr = arr.join(',').split(',') 
console.log(newArr)  // ["1", "2", "3", "4", "5", "6", "7", "8"](数组元素数据类型改变)

//第二种,遍历合并数组
var arr = [1,2,3,4,[5,6],7,8];
var newArr = [];
for (var i=0;i<arr.length;i++){
	newArr = newArr.concat(arr[i])
}
console.log(newArr)  //[1, 2, 3, 4, 5, 6, 7, 8]

//第三种,apply打散参数,再concat拼接
var arr = [1,2,3,4,[5,6],7,8];
var newArr = [];
newArr = newArr.concat.apply(newArr,arr);
console.log(newArr)  //[1, 2, 3, 4, 5, 6, 7, 8]

以上是二维数组降维,那如果是这种多维数组呢,[1,2,3,4,[5,6],[7,[8]],9],

//第一种,同样数组字符串互转
var arr = [1,2,3,4,[5,6],[7,[8]],9];
var newArr = arr.join(',').split(',');
console.log(newArr)  //["1", "2", "3", "4", "5", "6", "7", "8", "9"]

//第二种,遍历合并
var arr = [1,2,3,4,[5,6],[7,[8]],9];
var newArr = [];
for (var i=0;i<arr.length;i++){
	newArr = newArr.concat(arr[i])
}
console.log(newArr) //[1, 2, 3, 4, 5, 6, 7, Array(1), 9];

发现普通的循环遍历只能适应于纯数字或字符的二维数组,第三层或第n层的只是降维一度,我们需要降维一度再降维一度,一层层循环处理,即***递归 ***

那么***递归*** 是什么呢?

  • 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 ——百度百科-递归算法
  • 递归是程序调用自身的编程技巧(百度百科)。递归在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法(维基百科)。

说白了递归就是一种方法,是对自身的调用,比如说有个苹果(多维数组),我要一口一口吃掉这个苹果(降维函数),咬了一口,苹果少了一块(递归调用),咬一口少一块,咬…只剩一个苹果核了,不能吃了,结束(递归结束)。

另外递归有四个法则:

  • 第一个是基准情形,是不用递归就能求解。

  • 第二个法则是不断推进,也就是我的递归必须能朝着我的基准情形的方向推进。

  • 第三个法则是设计法则,是假设所有的递归调用都能运行。

  • 第四个法则是合成效益法则,是在求解一个问题的同一个实例时候,切勿在不同的递归调用中做重复性工作。(影响效率)

    说完递归,回到上面,我们用递归来处理多维数组, [1,2,3,4,[5,6],[7,[8]],9];

//递归处理多维数组---适用于非纯数字字符数组
var arr =  [1,2,3,4,[5,6],[7,[8]],9];
var newArr = [];
function squeeze(arrParam){
   for(var i=0;i<arrParam.length;i++){
   arrParam[i] instanceof Array ? squeeze(arrParam[i]) : newArr = newArr.concat(arrParam[i])
}
return newArr;
}
squeeze(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
var arr2 = [1,2,3,4,[5,6],[7,[8]],9,{a:'xxx'}];
squeeze(arr2) //[1, 2, 3, 4, 5, 6, 7, 8, 9, {…}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值