
本文介绍如何高效地遍历一个包含货币代码与数值的二维数组,根据另一个货币代码数组判断每个条目是否匹配,并在原数组每项末尾追加 1(存在)或 0(不存在)。
本文介绍如何高效地遍历一个包含货币代码与数值的二维数组,根据另一个货币代码数组判断每个条目是否匹配,并在原数组每项末尾追加 1(存在)或 0(不存在)。
在实际开发中,我们常需对结构化数据(如 [['USD', 1.0], ['EUR', 0.92]])进行条件增强——例如,依据一组目标标识符(如币种代码)为每条记录打上“命中”标记。本教程提供两种专业、简洁且符合现代 JavaScript 实践的解决方案:生成新数组(推荐,函数式、不可变)和就地修改原数组(适用于内存敏感或需复用引用的场景)。
✅ 方案一:使用 map() 创建新数组(推荐)
利用 Array.prototype.map() 配合数组解构与布尔转数字技巧(+Boolean),可一行完成逻辑:
const a = [ ["AED", 1], ["AFN", 22.08086], ["ALL", 27.171554], ["AMD", 105.058803], ["ANG", 0.487406], ["AOA", 227.493716], ["ARS", 95.308373], ["AUD", 0.420237], ["AWG", 0.487406], ["AZN", 0.462914], ["BAM", 0.490727], ["BBD", 0.544588] ]; const b = ["AED", "AFN", "AMD"]; const result = a.map(([code, ...rest]) => [code, ...rest, +b.includes(code)]); console.log(result); // 输出:[["AED",1,1],["AFN",22.08086,1],["ALL",27.171554,0],...,["BBD",0.544588,0]]
- ([code, ...rest]):解构每项,提取首元素(币种代码)和剩余值;
- b.includes(code) 返回 true/false;
- + 运算符将其强制转换为 1 或 0,语义清晰且性能优于 Number() 或三元表达式。
✅ 方案二:使用 forEach() 就地修改(谨慎使用)
若明确需复用原数组引用(如 Vue 响应式更新、避免内存拷贝),可用 forEach 直接 push:
a.forEach(item => item.push(+b.includes(item[0])));
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 此操作会改变原始数组 a 的结构和引用,可能影响其他依赖该数组的逻辑;
- 若 a 是受控状态(如 React state 或 Vuex store),务必先深拷贝(如 [...a.map(x => [...x])])再修改;
- b.includes() 在 b 较大时存在线性查找开销;如 b 元素超百个,建议预先转为 Set 提升至 O(1) 查询:
const bSet = new Set(b); // 替换原 b // 然后使用 bSet.has(code) 替代 b.includes(code)
? 总结
- 首选 map() + 解构 + +includes():语义明确、不可变、易测试、兼容性好(ES6+);
- 避免手动 for 循环:冗余、易错、缺乏声明式表达力;
- 注意数据不可变性原则:除非有强理由,否则优先生成新数组而非修改原数组;
- 性能优化点:当 b 规模较大时,用 Set 替代数组可显著提升匹配效率。
通过以上方法,你可快速、健壮地实现多维数组的条件标记任务,适用于汇率映射、权限校验、配置开关等多种业务场景。


















