felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

ES6 新增的 Array.from 方法 #212

Open felix-cao opened 2 years ago

felix-cao commented 2 years ago

Array.from 方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 SetMap

一、将类数组对象转为真正的数组

具有 length 属性的对象就是类数组对象

var arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的写法
var arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

去掉 length

var arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
};
var arr = Array.from(arrayLike); // []

对象的属性名为字符串型:

var arrayLike = {
    'a': 'a',
    'b': 'b',
    'c': 'c',
    length: 3
};
var arr = Array.from(arrayLike); // [undefined, undefined, undefined]

长度为4,元素均为 undefined 的数组, 由此可见将一个类数组对象转换为一个真正的数组,必须具备以下条件:

二、SET 结构数据

var arr = [11, 12,  14, 104, 105]
var set = new Set(arr)
console.log(Array.from(set))  // [11, 12,  14, 104, 105]

Array.from 还可以接受第二个参数,作用类似于数组的 map 方法,用来对每个元素进行处理,将处理后的值放入返回的数组。如下:

var arr = [11, 12,  14, 104, 105]
var set = new Set(arr)
console.log(Array.from(set, item => item + 1))  // [12, 13,  15, 105, 106]

三、将字符串转换为数组

var  str = 'hello world!';
console.log(Array.from(str)) // ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]