数组扁平化 js实现

本文详细介绍了JavaScript中数组扁平化的多种实现方法,包括Array.prototype.flat()函数及其参数用法,以及使用for循环、reduce、concat、toString等方法进行递归或迭代扁平化的实现。同时,还讨论了如何判断数组元素是否为数组,以及不同层次扁平化的需求。这些方法在处理嵌套数组时非常实用。
摘要由CSDN通过智能技术生成

数组扁平化 js实现

flat函数

Array.prototype.flat(参数)方法 该方法不会改变原数组,会返回一个新数组
语法:var newArray = arr.flat([depth])

说明:
depth为指定要提取嵌套数组的结构深度,默认值为1。
参数depth值 <=0 时返回原数组;
参数depth为Infinity 关键字时,无论多少层嵌套,都会转为一维数组,
flat()方法会移除数组中的空项,即原数组有空位,会跳过这个空位。

var arr1=[1,2,[2,3],[[4,5]],6]
var arr2=[2,5,5]
console.log(arr1.flat(Infinity))
console.log(arr2.flat(Infinity))
console.log(arr1)
// [1, 2, 2, 3, 4, 5, 6]
// [2, 5, 5]
// [1, 2, Array(2), Array(1), 6]

其他方案

遍历数组方案

for循环
for…of
for…in
entries()
keys()
values()
forEach()
map()
reduce()

判断数组元素是否为数组

instanceof
constructor
Object.prototype.toString
isArray

数组元素展开一层方案

扩展运算符 + concat — [].concat(…arr)
concat +apply — [].concat.apply([], arr) / Array,prototype.concat.apply([],arr)
toString + split 不推荐

递归实现

var arr = [1, [2, [3, 4]]];

function flatten(arr) {
    var result = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        if (Array.isArray(arr[i])) {
            result = result.concat(flatten(arr[i]))
        }
        else {
            result.push(arr[i])
        }
    }
    return result;
}
console.log(flatten(arr))

[].concat(…arr)展开一层

var arr = [1, [2, [3, 4]]];

function flatten(arr) {

    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }

    return arr;
}

console.log(flatten(arr))

reduce

var arr = [1, [2, [3, 4]]];

function flatten(arr) {
    return arr.reduce(function(prev, next){
        return prev.concat(Array.isArray(next) ? flatten(next) : next)
    }, [])
}

console.log(flatten(arr))

// 传参控制层数
function flat(arr, num = 1) {
  return num > 0
    ? arr.reduce(
        (pre, cur) =>
          pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur),
        []
      )
    : arr.slice();
}
const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "弹铁蛋同学" }]
flat(arr, Infinity);

使用字符串方法

// toString+split
var arr = [1, [2, [3, 4]]];

function flatten(arr) {
    return arr.toString().split(',').map(function(item){
        return +item
    })
}
console.log(flatten(arr))

// 使用数组方法join和字符串方法split进行数组扁平化
let arr1 = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
let res1 = arr1.join(",").split(",").map(Number);
// join(',')-扁平化的字符串,split(',')-字符串数组,map(Number)-Number数组
console.log(res1);

//通过正则方法和JSON.stringify()方法和数组方法
let res = JSON.stringify(arr1).replace(/\[|\]/g, "").split(",").map(Number);
console.log(res);

// 栈思想
function flat(arr) {
  const result = []; 
  const stack = [].concat(arr);  // 将数组元素拷贝至栈,直接赋值会改变原数组
  //如果栈不为空,则循环遍历
  while (stack.length !== 0) {
    const val = stack.pop(); 
    if (Array.isArray(val)) {
      stack.push(...val); //如果是数组再次入栈,并且展开了一层
    } else {
      result.unshift(val); //如果不是数组就将其取出来放入结果数组中
    }
  }
  return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值