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, {…}]

猜你喜欢

转载自blog.csdn.net/WCBandCTZ/article/details/88073421
今日推荐