zoukankan      html  css  js  c++  java
  • ES6中的Array.from()函数的用法

    ES6为Array增加了from函数用来将其他对象转换成数组。

    当然,其他对象也是有要求,也不是所有的,可以将两种对象转换成数组。

    1.部署了Iterator(迭代器)接口的对象,比如:Set,Map,Array。
    
    2.类数组对象,什么叫类数组对象,就是一个对象必须length属性,没有length,转出来的就是空数组。

    具体用法

    Array.from可以接受三个参数

    我们看定义:Array.from(arrayLike [, mapFn [, thisArg]])

    arrayLike:被转换的的对象。
    
    mapFn:map函数。
    
    thisArg:map函数中this指向的对象。
    第一个参数

    在这里很好理解,就是要被转换的对象

    第二个参数,map函数

    用来对转换中的每一个元素进行加工,并将加工后的结果作为结果数组的元素值。

    console.log(Array.from([1, 2, 3, 4, 5], (n) => n + 1))
    // 结果[2,3,4,5,6] map函数的实际的做用是给每个元素都加了1
    第三个参数,map函数中this指向的对象

    该参数是非常有用的,我们可以将被处理的数据和处理对象分离,将各种不同的处理数据的方法封装到不同的的对象中去,处理方法采用相同的名字。

    在调用Array.from对数据对象进行转换时,可以将不同的处理对象按实际情况进行注入,以得到不同的结果,适合解耦。

    这种做法是模板设计模式的应用,有点类似于依赖注入。

    const obj = {    
        add: function (n) {
            return n + 1;
        }
    }
    
    Array.from(
      [1, 2, 3, 4, 5], 
      function (x){
        return this.add(x)
      }, 
      obj)

    转换set对象

    const setArr = new Set();
    setArr.add(1).add(2).add("www");
    console.log(Array.from(setArr));
    // 结果 [1, 2, "www"]
    
    const setArr1 = new Set([1,1,12,2,3,4,5,5,6,6]);
    console.log(Array.from(setArr1));
    // 或者使用展开表达式 console.log([...setArr1]);
    // 结果 [1, 12, 2, 3, 4, 5, 6] 
    // 同时不难发现set具有去重的功能

    转换map对象

    const mapArr = new Map();
    mapArr.set('m1', 1);
    mapArr.set('m2', 2);
    mapArr.set('m3', 3);
    console.log(Array.from(mapArr));
    // 结果 [['m1', 1],['m2', 2],['m3', 3]]
    console.log(Array.from(mapArr)[1]);
    // 结果 ["m2", 2]

    转换类数组对象

    一个类数组对象必须要有length属性,他们的元素属性名必须是数值或者可以转换成数值的字符。

    注意:
    1. 属性名代表了数组的索引号,如果没有这个索引号,转出来的数组中对应的元素就为length长度个undefined。
    2. 如果没有length属性,转换出来的数组也是空的;
    带length
    //注意看区别
        console.log(Array.from({
              0: 'dd',
             1: 'gg',
              2: 'w3',
              length:3
        }))
        // 结果 ["dd", "gg", "w3"]
        
        console.log(Array.from({
              0: 'dd',
             1: 'gg',
              4: 'w3',
              length:3
        }))
        // 结果 ["dd", "gg", undefined]
        
        console.log(Array.from({
              "0": 'dd',
             1: 'gg',
              "3": 'w3',
              length:6
        }))
        // 结果 ["dd", "gg", undefined, "w3", undefined, undefined]
        
    //总结,生成数组的长度由length属性确定,如果相应索引位置上没有值,则为undefined
    不带length
    console.log( Array.from({
          0: 3,
          1: 12
    }))
    // 结果 []
    对象的属性名不能转换成索引号时
    console.log(Array.from({
          "s": 'dd',
         "ss": 'gg',
          "n": 'w3',
          length:3
    }))
     // 结果 [undefined, undefined, undefined]
    测试题:
    某公司 1 到 12 月份的销售额存在一个对象里面 如下:{1:222, 2:123, 5:888},请把数据处理为如下结构:[222, 123, null, null, 888, null, null, null, null, null, null, null]
    解答:
    function convert(obj){
      obj.length = 13;
      return Array.from(obj,x=>x||null).slice(1);
    }
    
    convert({1:222, 2:123, 5:888});
     
  • 相关阅读:
    编程是点滴的积累
    Tech.ED 2005 北京 第二天印象
    Tech.ED 2005 北京 第三天印象
    别把事情弄的太复杂
    在看《青衣》
    可以用的开源包
    KVM虚拟机的性能问题
    [zz]kvmlibvirt的使用:创建虚拟机与快照
    KVM快照snapshot
    [zz]kvm环境快照(snapshot)的使用方法
  • 原文地址:https://www.cnblogs.com/vickylinj/p/14197255.html
Copyright © 2011-2022 走看看