ES6之Array.from()方法

流年年不夏半殤發表於2019-03-22

Array.from()方法就是將一個類陣列物件或者可遍歷物件轉換成一個真正的陣列。

那麼什麼是類陣列物件呢?所謂類陣列物件,最基本的要求就是具有length屬性的物件。

1、將類陣列物件轉換為真正陣列:

let arrayLike = {
    0: 'tom', 
    1: '65',
    2: '男',
    3: ['jane','john','Mary'],
    'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['tom','65','男',['jane','john','Mary']]
複製程式碼

那麼,如果將上面程式碼中 length 屬性去掉呢?實踐證明,答案會是一個長度為0的空陣列。

這裡將程式碼再改一下,就是具有 length 屬性,但是物件的屬性名不再是數字型別的,而是其他字串型的,程式碼如下:

let arrayLike = {
    'name': 'tom', 
    'age': '65',
    'sex': '男',
    'friends': ['jane','john','Mary'],
    length: 4
}
let arr = Array.from(arrayLike)
console.log(arr)  // [ undefined, undefined, undefined, undefined ]
複製程式碼

會發現結果是長度為4,元素均為 undefined 的陣列

由此可見,要將一個類陣列物件轉換為一個真正的陣列,必須具備以下條件:

1、該類陣列物件必須具有 length 屬性,用於指定陣列的長度。如果沒有 length 屬性,那麼轉換後的陣列是一個空陣列。

2、該類陣列物件的屬性名必須為數值型或字串型的數字

該類陣列物件的屬性名可以加引號,也可以不加引號

2、將Set結構的資料轉換為真正的陣列:

let arr = [12,45,97,9797,564,134,45642]
let set = new Set(arr)
console.log(Array.from(set))  // [ 12, 45, 97, 9797, 564, 134, 45642 ]
複製程式碼

Array.from 還可以接受第二個引數,作用類似於陣列的 map 方法,用來對每個元素進行處理,將處理後的值放入返回的陣列。如下:

let arr = [12,45,97,9797,564,134,45642]
let set = new Set(arr)
console.log(Array.from(set, item => item + 1)) // [ 13, 46, 98, 9798, 565, 135, 45643 ]
複製程式碼

快速建立一個1~20的陣列

Array.from({length:20},(t,i)=>i+1)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
複製程式碼

模擬生成 1萬條資料

// 模擬生成 1萬條資料,利用了 Array.from 來快速生成資料
const originNews = Array.from(
    { length: 10000 },
    (v, k) => ({ content: `新聞${k}` })
)
複製程式碼

3、將字串轉換為陣列:

let  str = 'hello world!';
console.log(Array.from(str)) // ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]
複製程式碼

4、Array.from引數是一個真正的陣列:

console.log(Array.from([12,45,47,56,213,4654,154]))
複製程式碼

像這種情況,Array.from 會返回一個一模一樣的新陣列

把陣列按指定大小進行分組,可以用於分頁、資料切割、非同步運算元據。

const chunk = (arr, size) =>
  Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
    arr.slice(i * size, i * size + size)
  );
複製程式碼

相關文章