【JS基础】数组铺平 – 栈的方式 与 reduce+递归方式

目录

  1. 栈的方式
  2. reduce + 递归 的方式
  3. 遍历方式

一、栈的方式

while + (原始数据:concat成栈,后pop + 若item是数组则push) + (否则:结果数组unshift)得到最终铺平的数组

// 栈思想
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); //如果不是数组就将其取出来放入结果数组中,
      // 从头部插入,第一个插入的实际为result的最后一个。
      // 最后一个插入头部的实际为第一个。这就做到了尾部的还在尾部,头部的还在头部。
    }
  }
  return result;
}
const arr = [1, 2, 3,[4,[5]],6]
flat(arr);// [1, 2, 3, 4, 5, 6]

复制代码

二、reduce方式+递归

递归 concat可以铺平一级数组

function flat(arr){
   return  arr.reduce((pre, cur)=> pre.concat(Array.isArray(cur) ? flat(cur) : cur), [])
};
const arr = [1, 2, 3,[4,[5]],6]
flat(arr);// [1, 2, 3, 4, 5, 6]
复制代码

三、 遍历方式 map 或者 forEach

function flat1(arr){
    let res = [];
    arr.map((item,index)=>{ // arr.forEach一样可以
        if(Array.isArray(item)){
            res = res.concat(flat1(item));// concat的返回值才是组合后的数组。concat不改变原始数据
        }else{
            res.push(item); // push的返回值是数组的长度,一般没用。push会改变原始数据。
        }
    })
    return res;
}
const arr = [1, 2, 3,[4,[5]],6]
flat1(arr)
// [1, 2, 3, 4, 5, 6]
复制代码

总结

  • 栈的方式: while + (原始数据:concat成栈,后pop + 若item是数组则push) + (否则:结果数组unshift)得到最终铺平的数组
  • concat的返回值才是组合后的数组。concat不改变原始数据
  • push的返回值是数组的长度,一般没用。push会改变原始数据。

免责声明:务必仔细阅读

  • 本站为个人博客,博客所转载的一切破解、path、补丁、注册机和注册信息及软件等资源文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。

  • 本站为非盈利性站点,打赏作为用户喜欢本站捐赠打赏功能,本站不贩卖软件等资源,所有内容不作为商业行为。

  • 本博客的文章中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.

  • 本博客的任何内容,未经许可禁止任何公众号、自媒体进行任何形式的转载、发布。

  • 博客对任何脚本资源教程问题概不负责,包括但不限于由任何脚本资源教程错误导致的任何损失或损害.

  • 间接使用相关资源或者参照文章的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 博客对于由此引起的任何隐私泄漏或其他后果概不负责.

  • 请勿将博客的任何内容用于商业或非法目的,否则后果自负.

  • 如果任何单位或个人认为该博客的任何内容可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明至admin@proyy.com.我们将在收到认证文件后删除相关内容.

  • 任何以任何方式查看此博客的任何内容的人或直接或间接使用该博客的任何内容的使用者都应仔细阅读此声明。博客保留随时更改或补充此免责声明的权利。一旦使用并复制了博客的任何内容,则视为您已接受此免责声明.

您必须在下载后的24小时内从计算机或手机中完全删除以上内容.

您使用或者复制了本博客的任何内容,则视为已接受此声明,请仔细阅读


更多福利请关注一一网络微信公众号或者小程序

一一网络微信公众号
打个小广告,宝塔服务器面板,我用的也是,很方便,重点是免费的也能用,没钱太难了,穷鬼一个,一键全能部署及管理,送你3188元礼包,点我领取https://www.bt.cn/?invite_code=MV9kY3ZwbXo=


一一网络 » 【JS基础】数组铺平 – 栈的方式 与 reduce+递归方式

发表评论

发表评论

一一网络-提供最优质的文章集合

立即查看 了解详情