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

如何根据数组筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:45:17