亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

ES6+ Array.from()

1. 前言

在前端開發中經常會遇到類數組,但是我們不能直接使用數組的方法,需要先把類數組轉化為數組。本節介紹 ES6 數組的新增方法 Array.from(),該方法用于將類數組對象(array-like)和可遍歷的對象(iterable)轉換為真正的數組進行使用。

2. 方法詳情

2.1 基本語法

Array.from() 方法會接收一個類數組對象然后返回一個真正的數組實例,返回的數組可以調用數組的所有方法。

語法使用:

Array.from(arrayLike[, mapFn[, thisArg]])

參數解釋:

參數 描述
arrayLike 想要轉換成數組的類數組對象或可迭代對象
mapFn 如果指定了該參數,新數組中的每個元素會執行該回調函數
thisArg 可選參數,執行回調函數 mapFn 時 this 對象

2.2 類數組轉化

所謂類數組對象,就是指可以通過索引屬性訪問元素,并且對象擁有 length 屬性,類數組對象一般是以下這樣的結構:

var arrLike = {
  '0': 'apple',
  '1': 'banana',
  '2': 'orange',
  length: 3
};

在 ES5 中沒有對應的方法將類數組轉化為數組,但是可以借助 call 和 apply 來實現:

var arr = [].slice.call(arrLike);
// 或
var arr = [].slice.apply(arrLike);

有了 ES6 的 Array.from() 就更簡單了,對類數組對象直接操作,即可得到數組。

var arr = Array.from(arrLike);
console.log(arr)  // ['apple', 'banana', 'orange']

2.3 第二個參數 —— 回調函數

Array.from 中第二個參數是一個類似 map 函數的回調函數,該回調函數會依次接收數組中的每一項作為傳入的參數,然后對傳入值進行處理,最得到一個新的數組。
Array.from(obj, mapFn, thisArg) 也可以用 map 改寫成這樣 Array.from(obj).map(mapFn, thisArg)

var arr = Array.from([1, 2, 3], function (x) {
  return 2 * x;
});
var arr = Array.from([1, 2, 3]).map(function (x) {
  return 2 * x;
});
//arr: [2, 4, 6]

上面的例子展示了,Array.from 的參數可以使用 map 方法來進行替換,它們是等價的操作。

2.4 第三個參數 ——this

Array.from 中第三個參數可以對回調函數中 this 的指向進行綁定,該參數是非常有用的,我們可以將被處理的數據和處理對象分離,將各種不同的處理數據的方法封裝到不同的的對象中去,處理方法采用相同的名字。

在調用 Array.from 對數據對象進行轉換時,可以將不同的處理對象按實際情況進行注入,以得到不同的結果,適合解耦。

let obj = {
  handle: function(n){
    return n + 2
  }
}

Array.from([1, 2, 3, 4, 5], function (x){
  return this.handle(x)
}, obj)
// [3, 4, 5, 6, 7]

定義一個 obj 對象可以認作是,Array.from 回調函數中處理數據的方法集合,handle 是其中的一個方法,把 obj 作為第三個參數傳給 Array.from 這樣在回調函數中可以通過 this 來拿到 obj 對象。

2.5 從字符串里生成數組

Array.from() 在傳入字符串時,會把字符串的每一項都拆成單個的字符串作為數組中的一項。

Array.from('imooc'); 
// [ "i", "m", "o", "o", "c" ]

2.6 從 Set 中生成數組

Set 定義的數組對象,可以使用 Array.from() 得到一個正常的數組。

const set = new Set(['a', 'b', 'c', 'd']);
Array.from(set);
// [ "a", "b", "c", "d" ]

上面的代碼中創建了一個 Set 數據結構,把實例傳入 Array.from() 可以得到一個真正的數組。

2.7 從 Map 中生成數組

Map 對象保存的是一個個鍵值對,Map 中的參數是一個數組或是一個可迭代的對象。 Array.from() 可以把 Map 實例轉換為一個二維數組。

const map = new Map([[1, 2], [2, 4], [4, 8]]);

Array.from(map);  // [[1, 2], [2, 4], [4, 8]]

3. 使用案例

3.1 創建一個包含從 0 到 99 (n) 的連續整數的數組

  1. 一般情況下我們可以使用 for 循環來實現。
var arr = [];
for(var i = 0; i <= 99; i++) {
  arr.push(i);
}

這種方法的主要優點是最直觀了,性能也最好的,但是很多時候我們不想使用 for 循環來進行操作。

  1. 使用 Array 配合 map 來實現。
var arr = Array(100).join(' ').split('').map(function(item,index){return index});

Array (100) 創建了一個包含 100 個空位的數組,但是這樣創建出來的數組是沒法進行迭代的。所以要通過字符串轉換,覆蓋 undefined,最后調用 map 修改元素值。

  1. 使用 es6 的 Array.from 實現。
var arr = Array.from({length:100}).map(function(item,index){return index});

Array.from({length:100}) 可以定義一個可迭代的數組,數組的每一項都是 undefined,這樣就非常方便的定義出所需要的數組了,但是這樣定義的數組性能最差,具體可以參考 constArray 的測試結果。

3.2 數組去重合并

function combine(){ 
  let arr = [].concat.apply([], arguments);  //沒有去重復的新數組 
  return Array.from(new Set(arr));
} 

var m = [1, 2, 2], n = [2,3,3]; 
console.log(combine(m,n));                     // [1, 2, 3]

首先定義一個去重數組函數,通過 concat 把傳入的數組進行合并到一個新的數組中去,通過 new Set () 可以對 arr 進行去重操作,再使用 Array.from() 返回一個拷貝后的數組。

4. 小結

本節講解了字符串的 Array.from() 方法的使用,用于將類數組對象和可迭代的對象轉化真正的數組,在編程中主要用于更加方便的初始化一個有默認值的數組,還可以用于將獲取的 html 的 DOM 對象轉化為數組,可以使用數組方法進行操作。