为何无法用Array.from从Map的keys/values创建数组?
问题原因
prototype.js v1.6.1发布于ES6规范之前,它对Array的扩展逻辑未考虑ES6新增的迭代器(Iterator)类型。该版本的Array.from(或其内部模拟的类似实现)仅能处理带有length属性的类数组对象,而Map的keys()/values()返回的是ES6迭代器对象,没有length属性,因此被错误判定为空集合,最终返回长度为0的数组。
解决方案
以下几种方法可绕过这个兼容性问题:
- 使用扩展运算符(推荐):扩展运算符
...原生支持迭代器对象,能正确将Map的键/值集合转换为数组:
var m = new Map(); m.set("a", 1); m.set("b", 2); var arr1 = [...m.keys()]; var arr2 = [...m.values()]; console.log(arr1.length); // 输出2 console.log(arr2.length); // 输出2
- 手动遍历迭代器:通过
for...of循环遍历Map的键/值迭代器,手动构建数组:
var m = new Map(); m.set("a", 1); m.set("b", 2); var arr1 = []; for (const key of m.keys()) { arr1.push(key); } var arr2 = []; for (const value of m.values()) { arr2.push(value); } console.log(arr1.length); // 输出2 console.log(arr2.length); // 输出2
- 调用原生Array.from方法:若页面中Array的原生
from方法仍可通过属性描述符获取,可直接使用原生方法:
var m = new Map(); m.set("a", 1); m.set("b", 2); // 获取原生Array.from const nativeArrayFrom = Object.getOwnPropertyDescriptor(Array, 'from').value; var arr1 = nativeArrayFrom(m.keys()); var arr2 = nativeArrayFrom(m.values()); console.log(arr1.length); // 输出2 console.log(arr2.length); // 输出2
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

