簡體   English   中英

將 ES6 可迭代轉換為數組

[英]Convert ES6 Iterable to Array

假設您有一個類似數組的 Javascript ES6 Iterable,您事先知道它的長度是有限的,那么將其轉換為 Javascript 數組的最佳方法是什么?

這樣做的原因是很多js庫比如underscore和lodash都只支持Arrays,所以如果你想在Iterable上使用它們的任何一個函數,必須先把它轉換成一個Array。

在 python 中,你可以只使用 list() 函數。 ES6 中是否有等價物?

您可以使用Array.from傳播語法 (...)

例子:

 const x = new Set([ 1, 2, 3, 4 ]); const y = Array.from(x); console.log(y); // = [ 1, 2, 3, 4 ] const z = [ ...x ]; console.log(z); // = [ 1, 2, 3, 4 ]

概括:

  • Array.from()函數,它在輸入中接受一個可迭代對象並返回一個可迭代對象數組。
  • 展開語法: ...結合數組文字。

 const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]); const newArr1 = [ ...map ]; // create an Array literal and use the spread syntax on it const newArr2 = Array.from( map ); // console.log(newArr1, newArr2);

復制數組時的注意事項:

請注意,通過上述這些方法,當我們想要復制數組時,只會創建一個淺拷貝。 一個例子將闡明潛在的問題:

 let arr = [1, 2, ['a', 'b']]; let newArr = [ ...arr ]; console.log(newArr); arr[2][0] = 'change'; console.log(newArr);

這里由於嵌套數組,引用被復制並且沒有創建新數組。 因此,如果我們改變舊數組的內部數組,這種變化將反映在新數組中(因為它們引用的是同一個數組,引用被復制了)。

警告的解決方案:

我們可以通過使用JSON.parse(JSON.stringify(array))創建數組的深層克隆來解決淺拷貝的問題。 例如:

 let arr = [1, 2, ['a', 'b']] let newArr = Array.from(arr); let deepCloneArr = JSON.parse(JSON.stringify(arr)); arr[2][0] = 'change'; console.log(newArr, deepCloneArr)

您可以使用 ES6 中添加的Array.from方法,但僅支持數組和可迭代對象,如 Maps 和 Sets(也在 ES6 中提供)。 對於常規對象,您可以使用 Underscore 的toArray方法或 lodash 的 toArray 方法,因為這兩個庫實際上都對對象有很好的支持,而不僅僅是數組。 如果您已經在使用下划線或 lodash,那么幸運的是它們可以為您處理問題,同時為您的對象添加各種功能概念,例如 map 和 reduce。

以下方法已針對 Maps 進行了測試:

const MyMap = new Map([
  ['a', 1],
  ['b', 2],
  ['c', 3]
]);

const MyArray = [...MyMap].map(item => {
  return {[item[0]]: item[1]}
});

console.info( MyArray ); //[{"a", 1}, {"b", 2}, {"c": 3}]
 <Your_Array> = [].concat.apply([], Array.from( <Your_IterableIterator> ));

您也可以執行以下操作,但這兩種方法當然都不值得推薦(僅僅是完整性的概念驗證):

let arr = [];
for (let elem of gen(...)){
    arr.push(elem);
}

或者使用 ES5 + 生成器函數的“困難方式”( Fiddle在當前的 Firefox 中工作):

var squares = function* (n) {
  for (var i = 0; i < n; i++) {
    yield i * i;
  }
};

var arr = [];
var gen = squares(10);
var g;
while (true) {
  g = gen.next();
  if (g.done) {
    break;
  }
  arr.push(g.value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM