ES6为Array增长了from函数用来将其余对象转换成数组。设计模式
固然,其余对象也是有要求,也不是全部的,能够将两种对象转换成数组。数组
1.部署了Iterator(迭代器)接口的对象,好比:Set,Map,Array。 2.类数组对象,什么叫类数组对象,就是一个对象必须有length属性,没有length,转出来的就是空数组。
Array.from能够接受三个参数函数
咱们看定义:Array.from(arrayLike [, mapFn [, thisArg]])this
arrayLike:被转换的的对象。 mapFn:map函数。 thisArg:map函数中this指向的对象。
在这里很好理解,就是要被转换的对象spa
用来对转换中的每个元素进行加工,并将加工后的结果做为结果数组的元素值。设计
console.log(Array.from([1, 2, 3, 4, 5], (n) => n + 1)) // 结果[2,3,4,5,6] map函数的实际的作用是给每一个元素都加了1
该参数是很是有用的,咱们能够将被处理的数据和处理对象分离,将各类不一样的处理数据的方法封装到不一样的的对象中去,处理方法采用相同的名字。code
在调用Array.from对数据对象进行转换时,能够将不一样的处理对象按实际状况进行注入,以获得不一样的结果,适合解耦。对象
这种作法是模板设计模式的应用,有点相似于依赖注入。blog
const obj = { add: function (n) { return n + 1; } } console.log( Array.from( [1, 2, 3, 4, 5], function (x){ return this.add(x) }, obj)) //结果 [2,3,4,5,6]
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具备去重的功能
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属性,他们的元素属性名必须是数值或者能够转换成数值的字符。索引
//注意看区别 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
console.log( Array.from({ 0: 3, 1: 12 })) // 结果 []
console.log(Array.from({ "s": 'dd', "ss": 'gg', "n": 'w3', length:3 })) // 结果 [undefined, undefined, undefined]
补充