如何根据数组筛选JavaScript Map,仅保留数组包含的键对应项?
保留Map中指定键的正确实现方法
首先纠正你代码里的一个基础错误:Map的初始化语法不对,new Map()的参数应该是由键值对组成的二维数组,而不是对象数组。正确的初始化写法应该是:
let surfaces: Map<any, any> = new Map([ ["83.1", {}], ["84.1", {}] ]); let arr1 = ["83.1"];
你的两种循环写法之所以会删掉所有键,核心问题是循环逻辑错误:
- 第一种写法:如果
arr1有多个元素,只要有一个元素不等于当前键,就会删除该键,完全违背了"保留arr1中存在的键"的需求;哪怕arr1只有一个元素,也可能因为键的类型不匹配(比如Map的键是数字83.1,arr1是字符串"83.1")导致错误删除。 - 第二种写法:同样,只要
arr1中有一个元素不等于当前键,就会删除该键,逻辑完全颠倒。
正确实现方法
方法1:直接修改原Map(删除不需要的键)
先把Map的键转为数组(避免迭代Map时修改Map导致的迭代异常),然后遍历判断,删除不在arr1中的键:
// 把Map的键转成数组,防止迭代过程中修改Map引发的问题 Array.from(surfaces.keys()).forEach(key => { // 如果当前键不在arr1中,就删除 if (!arr1.includes(key)) { surfaces.delete(key); } });
方法2:创建新的过滤后的Map(不修改原Map)
如果需要保留原Map,可通过过滤原Map的键值对,生成新的Map:
const filteredSurfaces = new Map( Array.from(surfaces.entries()).filter(([key]) => arr1.includes(key)) );
额外提醒
如果你的Map键是数字类型(比如83.1),而arr1里是字符串类型(比如"83.1"),需要注意类型匹配问题,可在判断时统一类型,比如:
// 统一转为字符串后判断 Array.from(surfaces.keys()).forEach(key => { if (!arr1.includes(String(key))) { surfaces.delete(key); } });
内容的提问来源于stack exchange,提问作者addie293
相关产品推荐
相关产品推荐

