JavaScript数组方法--flat、forEach、map

今天到flat了,一个第一次知道该方法还是看到一个面试题,别人给了个答案,用到了flat才知道的方法。

前面也写过关于这道面试题的文章,《一道关于数组的前端面试题》。

这里再来说说吧!

  • flat:flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
    不考虑他所谓指定深度,直白一点来说,就是数组扁平化,也就是把一个有多层嵌套的数组,提取为一个只有一层的数组。
    同样,先看用法吧:

    var elements = [‘Fire‘, ‘Wind‘, ‘Rain‘, [‘apple‘, ‘orange‘, [1,2,3], ‘green‘]];
    console.log(elements.flat());
    console.log(elements.flat(Infinity));
    

      前面,已经看了那么多的数组方法,基本上可以说数组方法的使用,基本上是一个套路,没什么可以刻意解释的地方。到这里可能比较关心这两个调用方法的输出结果是什么!

    看出区别了吗?
    其实也就是参数导致的返回结果的差别。
    好吧,那我们就再来看他的语法吧!

    var newArray = arr.flat(depth)
    

    flat有一个参数depth,默认为1,那这个参数究竟起到什么样的作用呢?
    看他的解释,基本上就可以理解,“按照一个可指定的深度递归遍历数组”,这个参数depth也就是我们使用时所指定的深度,也就是说,我们可以指定遍历到多少层数组,提取出来扁平化。
    语言描述始终有点绕口,还是用示例来说吧!

    var elements = [‘Wind‘,[1,3, [4,6, [7,9, [10,[20,21],11,12]]]], ‘Rain‘];
    
    console.log(elements.flat());
    console.log(elements.flat(2));
    console.log(elements.flat(3));
    console.log(elements.flat(4));
    console.log(elements.flat(Infinity));
    

     我们把参数分别设置成了默认,和2、3、4、Infinity,看一下输出结果呢?

    看出什么了吗?也就是数组里面嵌套数组,一层层的嵌套的时候,通过指定depth,可以递归到那一层深度的数组,展开合并到第一层。事实上,这种用法的场景似乎并不多,基本上要不是展开所有层级的数组元素,要不就是只展开第一层的,所以参数值用的最多的应该就是Infinity,和不传参数吧!
    考虑到这一点,以及递归到指定深度这种确实比较麻烦,所以我们重构该方法的时候,就只通过布尔值提供展开第一层和所有层级的选项吧!

    function flat (arr, depth) {
      if (!(arr instanceof Array)) throw new Error("请确保第一个参数类型为数组")
      var results = []
      for (var i = 0; i < arr.length; i++) {
        if (!(arr[i] instanceof Array)) {
          results[results.length] = arr[i]
        } else {
          for (var j = 0; j < arr[i].length; j++) {
            if (depth && (arr[i][j] instanceof Array)) {
              var dees = flat(arr[i][j], depth)
              if (dees instanceof Array) {
                for (var n = 0; n < dees.length; n++) {
                  results[results.length] = dees[n]
                }
              }
            } else {
              results[results.length] = arr[i][j]
            }
          }
        }
      }
      return results
    }
    

      稍微解释一下,两次循环,第一次循环的是数组本身,如果当前元素类型不是数组,那直接存入到results当中,如果是数组,就再做一次循环,这一次就有点区别了,需要判断depth参数值了,如果depth为false,或者当前元素不是数组,那么依然直接存到results当中,如果depth=true,并且元素依然是数组,那就需要递归调用dees = flat(arr[i][j]),然后对dees再次循环存入results。最终返回results。
    比较复杂的flat介绍完了,下面是比较常用的forEach了。

  • forEach:forEach() 方法对数组的每个元素执行一次提供的函数。
    字面理解就是相当于封装一下for循环。跟我们jQuery当中的$.each方法非常类似。
    我们直接看语法吧:

    arr.forEach(callback[, thisArg]);
    

      又遇到了回调函数,与之前的一样,回调函数的参数完全一样,当前元素值,索引,数组本身。以及forEach函数另一个可选的指向this的参数。
    真没啥好说的,就是在循环体内,执行一次回调函数。

    function forEach(arr, fn, thisArg) {
      if (!(arr instanceof Array)) throw new Error("请确保第一个参数类型为数组")
      for (var i = 0; i < arr.length; i++) {
        fn.call(thisArg, arr[i], i)
      }
      return arr
    }
    

      好了,forEach说完了。

  • map: map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
    一个与forEach特别像的方法,最大的区别是,map返回新的数组实例。那么就需要回调函数有返回值,利用每一个回调函数返回结果,组成新的数组实例。
    用法与forEach完全一致:

    var new_array = arr.map(function callback(currentValue[, index[, array]]) {
         // Return element for new_array }[,
    thisArg])
    

     直接看重构的方法吧!

    function map(arr, fn, thisArg) {
      if (!(arr instanceof Array)) throw new Error("请确保参数类型为数组")
      var results = []
      for (var i = 0; i < arr.length; i++) {
        results[i] = fn.call(thisArg, arr[i], i)
      }
      return results
    }

     map也说完了,只能说经历了flat的洗礼,forEach和map实在是太简单了。 

原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/10605577.html

时间: 2024-08-03 00:38:57

JavaScript数组方法--flat、forEach、map的相关文章

Javascript数组Array的forEach方法

Javascript数组Array的forEach扩展方法 forEach是最常用到的数组扩展方法之一,相当于参数化循环数组,它简单的在数组的每一个元素上应用传入的函数,这也意味着只有存在的元素会被访问和处理.  如果我们用console.log替换处理函数,将可以得到另外的有趣结果: [1,2,3,"csser"].forEach(console.log); 结果: 1, 0, Array[1, 2, 3, "csser"] 2, 1, Array[1, 2, 3

JavaScript数组方法详解

JavaScript数组方法详解 JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法:并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中原型上的方法,本文举例介绍了从ES3到ES7几乎所有的数组方法.这大概是最全的数组方法详解了.希望读者能从中有所收获. 一.各版本数组方法一览表 数组方法名 对应版本 功能 原数组是否改变 pop() ES3- 删除最后一位,并返回删除的数据 是 push() ES3- 在最后一位新增一或多个数据,

JavaScript数组方法对比(深度学习数组)

JavaScript数组方法对比 众所周知,JavaScript提供了许多对数组进行改变的方法,但是有些会对原数组进行影响,有些不会.下边就列举出来. 一.新增 影响原数组 array.push()  //向数组的末尾添加一个或更多元素,并返回新的长度. var array =[1,2,3,4,5]; array.push(6); // [1,2,3,4,5,6]; array.unshift() //向数组的开头添加一个或更多元素,并返回新的长度. var array =[1,2,3,4,5]

JavaScript数组方法的兼容性写法 汇总:indexOf()、forEach()、map()、filter()、some()、every()

ECMA Script5中数组方法如indexOf().forEach().map().filter().some()并不支持IE6-8,但是国内依然有一大部分用户使用IE6-8,而以上数组方法又确实非常好用.在过去,我会为了兼容性尽量不用这些方法.但是,总不能为了旧的丢了新的吧?!虽然说jQuery已经集成好了不少语法糖,但jQuery体积太庞大,作为一名志于体面的前端儿得知道原生的兼容性写法要怎么写.于是这几天,我开始在琢磨这些方法的兼容性写法.其实并不难,就是以前不够自信不敢写.写完以后,

JavaScript数组方法总结

由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaScript教程的整理,具体内容如下: 一.普通方法 1.join() 将数组元素连接在一起,并以字符串形式返回参数:可选,指定元素之间的分隔符,没有参数则默认为逗号返回值:字符串对原数组的影响:无2.reverse()将数组的元素顺序变成倒序返回参数:无返回值:数组对原数组的影响:原数组被修改为倒序排列之后的数组3.sort()对数组元素进行排序并返回参数:可选,排序的方法函数,没有

JavaScript数组方法大全(第二篇)

数组方法大全(第二篇) 注意:如有错误欢迎指出,如有雷同纯属巧合,本博客参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 forEach()方法 遍历数组,里面可以传递一个方法 var arr = [1,2,3]; arr.forEach(function (item,index,array) { //item:表示数组中元素的每一项 //index:表示每一项所对应的索引 //array:表示原数组 }) map()方法 将调用数组的每个元素传递给指定的函数,并返回一个新的

JavaScript - 数组方法应用

数组方法应用 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

4个错误使用JavaScript数组方法的案例

译者按: 做一个有追求的工程师,代码不是随便写的! 原文: Here's how you can make better use of JavaScript arrays 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 小编推荐:Fundebug专注于JavaScript.微信小程序.微信小游戏,Node.js和Java线上bug实时监控.真的是一个很好用的bug监控服务,众多大佬公司都在使用. 我保证这是一篇可以快速阅读并吸收的文章

JavaScript数组方法整理

原文链接:https://www.cnblogs.com/zyfeng/p/10541133.html 整理了以下数组方法 join() push()和pop() shift() 和 unshift() sort() reverse() concat() slice() splice() indexOf()和 lastIndexOf() (ES5新增) forEach() (ES5新增) map() (ES5新增) filter() (ES5新增) every() (ES5新增) some()