[英]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.