介绍 Node.js v22 新增的 `toArray` 方法

最近在写一个 Code Review Agent,有下面一段代码:

js 复制代码
const available_files = file_index
  .keys()
  .filter((k) => k !== file.path)
    
const decision_prompt = `${build_followup_prompt(file.path, findings, available_files)}

--- Tool Results ---
${context_addendum}

Based on these results, what's your next action?`

解释:build_followup_prompt 接受当前需要 Review 的文件和首轮已经被 Agent Review 过后的 findings(发现的问题)以及除了自身之外的其他文件,然后总结成一段提示词,进入 loop:让 Agent 决策是结束还是使用工具(cat / grep / find......)还是用 skill(security-audit / performance-review /...)继续 Review。

但现在的代码有问题 build_followup_prompt 接受的 available_files 是字符串数组。然而 file_indexMapkeys() 后变成 Iterator 然后被 filter,过后仍然是 Iterator

故需要将 Iterator 转成 Array

如果按照过往经验,我这个时候会使用 Array.from 或者更简洁的扩展操作符 [...]

但是我今天突发奇想,有没有 toArray 方法?

diff 复制代码
const available_files = file_index
  .keys()
  .filter((k) => k !== file.path)
+ .toArray()

还真有,既然我不知道肯定有更多人不知道,故今天分享下 toArray()

题外话:toArray 和 rs 的 collect 非常相似:

rs 复制代码
let available_files: Vec<&str> = file_index
    .keys()
    .filter(|&&k| k != file.path)
    .copied()
    .collect(); // ←

下面内容来自 MDN。

iterator.toArray

迭代器(Iterator)实例的 toArray() 方法会创建一个全新数组(Array),并将迭代器产出的所有元素填充至该数组中。

js 复制代码
toArray()

返回值

一个全新数组实例,按迭代器元素的产出顺序存放所有迭代项。

示例

iterator.toArray() 效果等同于 Array.from(iterator) 与扩展运算符写法 [...iterator],优势在于链式调用多个迭代器工具方法时代码更简洁。

下面示例生成一个输出斐波那契数列的迭代器,取出前 10 项、过滤掉奇数,最后转为数组:

js 复制代码
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const array = fibonacci()
  .take(10)
  .filter((x) => x % 2 === 0)
  .toArray();

console.log(array); // [2, 8, 34]

注意:建议将 toArray() 作为数据处理的最后一步。

反例:fibonacci().take(10).toArray().filter(...) 效率更低,因为迭代器工具方法采用惰性求值,能省去中间临时数组的创建开销。

兼容性

Node.js v22、Chrome v122

平常写 CLI 够用了

扩展

除了 toArray filter 还有哪些 iterator helper methods 呢?全部都在这:

  • forEach
  • some / every
  • map / flatMap / reduce
  • find / includes
  • drop / take

可见基本和数组类似,多了 drop / take

相关推荐
FungLeo1 天前
成为全栈·Node 后端篇·容器化:给 Node 应用写一个像样的 Dockerfile
docker·node.js·dockerfile·成为全栈·后端服务容器·docker 容器
枫叶梨花1 天前
Electrobun透明窗口在Windows上的输入穿透排查
前端·electron·bun
WeiXin_DZbishe1 天前
基于springboot大学生提问箱系统-计算机毕设【课程设计】72593
javascript·vue.js·spring boot·vscode·python·node.js·php
xixiaoyunya1 天前
Docker 容器化部署实战:从零搭建一套完整的 Nginx + Node.js + MySQL + Redis 项目环境
nginx·docker·node.js
晴天161 天前
npm install -f(--force)深度解析:作用原理、报错根源与风险避坑指南
前端·npm·node.js
还是大剑师兰特1 天前
Swagger 在 Node.js 项目中的安装和完整使用方法
node.js
FungLeo2 天前
成为全栈·Node 后端篇·全文搜索:从 LIKE 到全文索引
node.js·全文索引·模糊搜索·全文搜索·成为全栈·like 搜索
倾颜2 天前
AI Chat 长会话性能实践:消息虚拟化、动态高度与流式滚动设计
前端·react.js·node.js
FungLeo2 天前
成为全栈·Node 后端篇·接口文档自动化:让 OpenAPI 与代码不脱节
node.js·openapi·成为全栈·接口文档自动化
右耳朵猫AI2 天前
Node.js周刊2026W36 | NestJS 12发布、Remix 3 RC、pnpm 12 Rust重写、Node.js 26.8.0
开发语言·rust·node.js