将ES6 Iterable转换为Array

Mic*_*tra 70 javascript arrays iterable ecmascript-6 babeljs

假设你有一个类似数组的Javascript ES6 Iterable,你事先知道它的长度是有限的,将它转换为Javascript数组的最佳方法是什么?

这样做的原因是许多js库(如下划线和lodash)仅支持Arrays,因此如果您希望在Iterable上使用它们的任何函数,则必须首先将其转换为Array.

在python中,您可以使用list()函数.在ES6中是否有相同的东西?

Xåp*_* - 122

您可以使用Array.fromspread运算符.

例:

let x = new Set([ 1, 2, 3, 4 ]);

let y = Array.from(x);
console.log(y); // = [ 1, 2, 3, 4 ]

let z = [ ...x ];
console.log(z); // = [ 1, 2, 3, 4 ]
Run Code Online (Sandbox Code Playgroud)

  • 几乎相同的情况适用于ES6`let m = new Map()`data-structure:获取Map的值,在`m.values()`上使用`Array.from`或spread运算符,对于m来说也是如此.键()`.否则,你将得到一个数组数组:`[[key,value],[key,value]]`. (2认同)

Col*_*wig 11

您可以使用在ES6中添加的Array.from方法,但仅支持数组和可迭代对象(如地图和集合)(也在ES6中).对于常规对象,您可以使用Underscore 的toArray方法或lodash的toArray方法,因为这两个库实际上都支持对象,而不仅仅是数组.如果你已经使用了下划线或lodash,那么幸运的是他们可以为你处理这个问题,同时为你的对象添加map和reduce等各种功能概念.


Wil*_*een 9

摘要:

  • Array.from() 函数,它接受输入中的iterable并返回iterable的数组。
  • 传播运算符:...与数组文字组合。

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); 
Run Code Online (Sandbox Code Playgroud)

复制数组时的警告:

请注意,当我们要复制数组时,通过上述方法只能创建浅表副本。一个例子将解决潜在的问题:

let arr = [1, 2, ['a', 'b']];

let newArr = [ ...arr ];

console.log(newArr);

arr[2][0] = 'change';

console.log(newArr);
Run Code Online (Sandbox Code Playgroud)

在这里,由于嵌套的数组,引用被复制,并且没有创建新的数组。因此,如果我们更改旧数组的嵌套数组,则此更改将反映在新数组中(因为它们引用同一数组,因此已复制了引用)。

警告的解决方案:

我们可以通过使用创建深层数组副本来解决浅表副本的问题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)
Run Code Online (Sandbox Code Playgroud)