数组拍平五种方式(含基础内容回顾)

把多维数组转换为一维数组的方法:

  • 方法一:toString( )
//答案:
function flatten(arr) {
	return arr.toString().split(',').map(function(item){
		return +item;//类型准换为 
	})
}
//解析:
arr=[[1,2,3],[4,5,6],[7,8,9]]
console.log(arr.toString());
//输出 1,2,3,4,5,6,7,8,9
console.log(arr.toString().split(","));
//输出 (9) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
  • 方法二:展开运算符 arr.some

知识点:
arr.some(()=>{}) 用于逐一检查数组中是否有元素满足某个条件,有就返回 true,并且不再继续向下检查。没有就返回 false。
concat 用于连接多个数组。`arr = [1,2,3],res = arr.concat(arr,1)

function flatten(arr) {
	//检查 arr 中是否有元素是数组:
	while(arr.some((item)=>{Array.isArray(item)})){
		arr = [].concat(...arr);//逐层拨开洋葱的心,直到没有数组
	}
	return arr;
}

//解析:
let arr = [1,2,3]
console.log(...arr);// 1  2  3
let arr2 = [[1,2,3],[4,5,6],[7,8,9]];
console.log(...arr2);//[1,2,3] [4,5,6] [7,8,9]
res = [].concat(...arr2)//[].concat([1,2,3],[4,5,6],[7,8,9])
console.log(res);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 方法三:递归
var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]];
function fn(arr){
   let arr1 = []
     arr.forEach((val)=>{
         if(val instanceof Array){
             arr1 = arr1.concat(fn(val))
             //[1,2].concat([3,4,5].concat(fn([6,7,8])))
         }else{
             arr1.push(val)
         }
      })
      return arr1
 }
  • 方法四:ES6 的 flat 方法
function flatten(arr) {
	return arr.flat(Infinity);
}
//解析:
var arr1 = [1, 2, [3, 4]];
arr1.flat(); // [1, 2, 3, 4]
 
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();// [1, 2, 3, 4, [5, 6]] 默认展开一层深度
 
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);// [1, 2, 3, 4, 5, 6] 

arr3.flat(Infinity); //使用 Infinity 作为深度,展开任意深度的嵌套数组
arr.reduce((total,curItem,curIndex,arr)=>{return ....},initialTotal)
//计算每一位四舍五入的和 arr = [1.3,5.0,66.8]
function fun(arr){
    return arr.reduce((pre,cur)=>{
        return pre + Math.round(cur)
    },0)
}

reduce + 递归实现数组拍平

function flatten(arr) {
	return arr.reduce((pre,cur)=>{
       pre.concat(cur instanceof Array?flatten(cur):) 
    },[])
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值