如何过滤Map对象中的条目?已知Array.prototype.filter()但Map返回Iterator
过滤Map对象条目的几种方法
嗨,这个问题我之前也碰到过!确实Map.prototype.entries()返回的是迭代器而非数组,没法直接用Array.prototype.filter(),不过有几个实用的办法可以解决:
转数组过滤后重建Map
这是最直观简洁的方法,先用Array.from()或者展开运算符[...]把Map的迭代器转换成键值对数组,接着用filter()筛选符合条件的条目,最后把筛选后的数组传给new Map()就能得到新的过滤后的Map了。示例代码:
const myMap = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4]]); // 用Array.from转换 const filteredMap1 = new Map( Array.from(myMap.entries()).filter(([key, value]) => value > 2) ); // 用展开运算符更简洁 const filteredMap2 = new Map( [...myMap.entries()].filter(([key, value]) => value > 2) ); // 两种方法都会得到 Map(2) {'c' => 3, 'd' => 4}手动遍历迭代器构建新Map
如果你的Map数据量很大,不想先转成数组占用额外内存,可以直接用for...of循环遍历Map的条目,判断条件后把符合的条目添加到新Map中。示例代码:
const myMap = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4]]); const filteredMap = new Map(); for (const [key, value] of myMap.entries()) { if (value > 2) { filteredMap.set(key, value); } } // 结果同样是 Map(2) {'c' => 3, 'd' => 4}给Map添加自定义filter方法(不推荐全局使用)
如果你希望像数组一样直接调用filter()方法,可以给Map原型添加自定义方法,但注意这种方式可能会污染全局原型,只适合在自己的项目中使用,避免和其他代码冲突。示例代码:
// 自定义filter方法 Map.prototype.filter = function(callback) { const filteredMap = new Map(); for (const [key, value] of this.entries()) { // 回调函数参数和数组filter对齐:value, key, 原Map if (callback(value, key, this)) { filteredMap.set(key, value); } } return filteredMap; }; // 使用方式 const myMap = new Map([['a', 1], ['b', 2], ['c', 3], ['d', 4]]); const filteredMap = myMap.filter((value) => value > 2);
日常开发中最常用的是第一种方法,简洁易读;如果对内存性能有要求,第二种方法更合适。
内容的提问来源于stack exchange,提问作者Wit
相关产品推荐
相关产品推荐

