You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:03:14