最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?Map函數(shù)的二度補(bǔ)充(附詳細(xì)代碼)

 更新時(shí)間:2025年12月12日 09:08:56   作者:放逐者-保持本心,方可放逐  
在JavaScript中map函數(shù)是一個常用的數(shù)組方法,它用于對數(shù)組中的每個元素執(zhí)行指定的操作,并返回一個新數(shù)組,而不修改原數(shù)組,這篇文章主要介紹了JavaScript?Map函數(shù)的相關(guān)資料,需要的朋友可以參考下

Map

在 JavaScript 生態(tài)中,Map 作為 ES6 引入的核心數(shù)據(jù)結(jié)構(gòu),常被開發(fā)者當(dāng)作"高級對象"使用,卻鮮少有人真正觸及它的設(shè)計(jì)本質(zhì)與拓展?jié)摿?。本文將從基礎(chǔ)到深層,對 Map 進(jìn)行全方位"回爐深造",挖掘其被忽視的價(jià)值。

一、基礎(chǔ)用法的再審視:不止于鍵值存儲

Map 的基礎(chǔ)語法看似簡單,實(shí)則暗藏與對象(Object)的本質(zhì)差異,這些差異正是其獨(dú)特價(jià)值的起點(diǎn)。

核心語法回顧

// 初始化方式
const map = new Map();
const mapFromArray = new Map([['key1', 'value1'], ['key2', 'value2']]);
const mapFromMap = new Map(existingMap);

// 核心操作
map.set('name', 'map');       // 添加/更新鍵值對,返回Map本身(支持鏈?zhǔn)秸{(diào)用)
map.get('name');              // 獲取值,不存在則返回undefined
map.has('name');              // 判斷鍵是否存在,返回布爾值
map.delete('name');           // 刪除鍵值對,返回操作結(jié)果
map.clear();                  // 清空所有鍵值對
map.size;                     // 獲取鍵值對數(shù)量(注意:無括號,區(qū)別于數(shù)組length)

與對象的本質(zhì)區(qū)別(常被忽略的細(xì)節(jié))

  1. 鍵的類型自由度Map 的鍵可以是任意類型(原始值、對象、函數(shù)等),而對象的鍵會被強(qiáng)制轉(zhuǎn)換為字符串(對象鍵會被轉(zhuǎn)為 [object Object])。

    const obj = {};
    const key = { id: 1 };
    obj[key] = 'value'; 
    console.log(Object.keys(obj)); // ["[object Object]"]
    
    const map = new Map();
    map.set(key, 'value');
    map.get(key); // "value"(精準(zhǔn)匹配引用)
    
  2. 迭代順序Map 嚴(yán)格按照鍵的插入順序迭代,而對象在 ES6 前無明確順序(數(shù)字鍵會被優(yōu)先排序)。

  3. 性能特性:在頻繁增刪鍵值對的場景中,Map 的性能表現(xiàn)優(yōu)于對象(V8 引擎對 Map 的哈希表實(shí)現(xiàn)更高效)。

  4. 內(nèi)存占用:相同數(shù)量的鍵值對,Map 通常比對象占用更少內(nèi)存(尤其鍵值對數(shù)量動態(tài)變化時(shí))。

二、應(yīng)用場景的深度挖掘:超越常規(guī)存儲

Map 的應(yīng)用遠(yuǎn)不止"存儲鍵值對",其特性使其在特定場景中成為最優(yōu)解。

1. 復(fù)雜鍵的精準(zhǔn)映射

當(dāng)需要以對象、函數(shù)等作為鍵時(shí),Map 是唯一選擇。例如在緩存場景中:

// 緩存函數(shù)計(jì)算結(jié)果(以函數(shù)和參數(shù)作為復(fù)合鍵)
const cache = new Map();

function compute(keyObj) {
  // 用對象作為鍵,直接關(guān)聯(lián)計(jì)算結(jié)果
  if (cache.has(keyObj)) {
    return cache.get(keyObj);
  }
  const result = heavyComputation(keyObj); // 假設(shè)的耗時(shí)計(jì)算
  cache.set(keyObj, result);
  return result;
}

2. 有序鍵值對的迭代處理

需要保留插入順序并批量處理時(shí),Map 的迭代能力遠(yuǎn)超對象:

const steps = new Map([
  ['init', () => console.log('初始化')],
  ['process', () => console.log('處理中')],
  ['complete', () => console.log('完成')]
]);

// 按插入順序執(zhí)行流程
for (const [name, step] of steps) {
  console.log(`執(zhí)行步驟:${name}`);
  step();
}

3. 數(shù)據(jù)去重與關(guān)聯(lián)

利用 Map 鍵的唯一性,可高效實(shí)現(xiàn)復(fù)雜數(shù)據(jù)去重:

// 對對象數(shù)組去重(根據(jù)id字段)
const users = [
  { id: 1, name: 'a' },
  { id: 1, name: 'b' },
  { id: 2, name: 'c' }
];

const uniqueUsers = new Map();
users.forEach(user => {
  if (!uniqueUsers.has(user.id)) {
    uniqueUsers.set(user.id, user);
  }
});
[...uniqueUsers.values()]; // 去重后的數(shù)組

4. 替代對象作為配置容器

在需要動態(tài)鍵且需頻繁檢查鍵存在性的場景(如插件配置):

const pluginConfig = new Map();

// 注冊插件配置
pluginConfig.set('logger', { level: 'info' });
pluginConfig.set('router', { mode: 'history' });

// 安全獲取配置(避免對象的undefined屬性鏈問題)
function getPluginConfig(name) {
  return pluginConfig.get(name) || defaultConfig;
}

三、設(shè)計(jì)思想的溯源:為何需要 Map?

Map 的誕生并非偶然,而是 JavaScript 對"鍵值映射"這一基礎(chǔ)需求的規(guī)范化實(shí)現(xiàn),其設(shè)計(jì)思想可從三個維度解讀:

1. 彌補(bǔ)對象作為映射表的缺陷

在 ES6 前,開發(fā)者被迫用對象模擬映射表,但對象存在天然局限:鍵類型受限、無明確順序、原型鏈污染風(fēng)險(xiǎn)('__proto__' 鍵會干擾原型)。Map 從根源解決了這些問題:

  • 鍵的類型無關(guān)性(突破字符串限制)
  • 完全隔離于原型鏈(map.has('__proto__') 始終為 false,除非主動設(shè)置)
  • 內(nèi)置 size 屬性(無需手動計(jì)算鍵數(shù)量)

2. 函數(shù)式編程的配套設(shè)施

Map 提供了原生迭代器(keys()、values()、entries()),完美適配 for...of、擴(kuò)展運(yùn)算符(...)等 ES6 特性,使其能無縫融入函數(shù)式編程范式:

// 函數(shù)式轉(zhuǎn)換:Map → 過濾 → 映射 → 數(shù)組
const filtered = [...new Map([[1, 'a'], [2, 'b'], [3, 'c']])
  .entries()]
  .filter(([k]) => k > 1)
  .map(([k, v]) => ({ [k]: v }));

3. 面向數(shù)據(jù)的結(jié)構(gòu)化設(shè)計(jì)

Map 將"鍵值對集合"抽象為獨(dú)立數(shù)據(jù)類型,使其能作為一等公民參與運(yùn)算(如作為函數(shù)參數(shù)/返回值、與其他數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換),這與 JavaScript 向"數(shù)據(jù)驅(qū)動"發(fā)展的方向高度契合。

四、鍵值對的拓展應(yīng)用:從基礎(chǔ)到高級

Map 的鍵值對能力可通過組合與變形,實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。

1. 多維度索引(復(fù)合鍵技術(shù))

通過將多個值組合為鍵(如數(shù)組),實(shí)現(xiàn)多條件映射:

// 存儲不同用戶在不同場景下的權(quán)限
const permissions = new Map();

// 復(fù)合鍵:[userId, scene]
permissions.set([1, 'admin'], ['read', 'write']);
permissions.set([1, 'guest'], ['read']);

// 查詢權(quán)限
function getPermission(userId, scene) {
  // 注意:數(shù)組作為鍵時(shí)需引用相同實(shí)例,或用字符串序列化
  const key = [...permissions.keys()].find(k => k[0] === userId && k[1] === scene);
  return key ? permissions.get(key) : [];
}

// 優(yōu)化方案:用字符串序列化復(fù)合鍵
permissions.set(`${1}|admin`, ['read', 'write']); // 鍵為"1|admin"

2. 雙向映射(Inverse Map)

基于 Map 構(gòu)建雙向鍵值映射,實(shí)現(xiàn)鍵值互查:

class TwoWayMap {
  constructor() {
    this.forward = new Map(); // key → value
    this.backward = new Map(); // value → key
  }

  set(key, value) {
    this.forward.set(key, value);
    this.backward.set(value, key);
  }

  get(key) { return this.forward.get(key); }
  getKey(value) { return this.backward.get(value); }
}

// 應(yīng)用:中英文映射
const dict = new TwoWayMap();
dict.set('hello', '你好');
dict.get('hello'); // "你好"
dict.getKey('你好'); // "hello"

3. 過期鍵自動清理(TTL 機(jī)制)

結(jié)合定時(shí)器實(shí)現(xiàn)帶過期時(shí)間的 Map

class TTLMap extends Map {
  set(key, value, ttl = 1000) { // ttl:毫秒
    super.set(key, value);
    // 清除舊定時(shí)器
    if (this.timeouts.has(key)) {
      clearTimeout(this.timeouts.get(key));
    }
    // 設(shè)置新定時(shí)器
    const timeout = setTimeout(() => this.delete(key), ttl);
    this.timeouts.set(key, timeout);
  }

  constructor() {
    super();
    this.timeouts = new Map(); // 存儲定時(shí)器
  }
}

// 應(yīng)用:臨時(shí)緩存
const tempCache = new TTLMap();
tempCache.set('tempData', 'value', 2000); // 2秒后自動刪除

五、鍵值對的拓展場景及解決方案

針對實(shí)際開發(fā)中的復(fù)雜場景,Map 可通過封裝實(shí)現(xiàn)更強(qiáng)大的功能。

場景1:多級嵌套數(shù)據(jù)的高效訪問

問題:深層嵌套對象(如 obj.a.b.c)訪問時(shí)需多次判空,且修改不便。

方案:用 Map 扁平化存儲路徑與值,配合路徑解析:

class PathMap extends Map {
  // 以數(shù)組作為路徑鍵,如 ['a', 'b', 'c']
  setPath(path, value) {
    super.set([...path], value);
  }

  getPath(path) {
    return super.get([...path]);
  }

  // 從嵌套對象初始化
  fromNested(obj, parentPath = []) {
    for (const [key, value] of Object.entries(obj)) {
      const currentPath = [...parentPath, key];
      if (typeof value === 'object' && value !== null) {
        this.fromNested(value, currentPath);
      } else {
        this.setPath(currentPath, value);
      }
    }
  }
}

// 使用
const nestedObj = { a: { b: { c: 1 } }, d: 2 };
const pathMap = new PathMap();
pathMap.fromNested(nestedObj);
pathMap.getPath(['a', 'b', 'c']); // 1(無需判空)

場景2:高頻讀寫的狀態(tài)管理

問題:前端狀態(tài)管理需頻繁更新并觸發(fā)響應(yīng),普通對象性能不足。

方案:基于 Map 封裝響應(yīng)式狀態(tài)容器:

class ReactiveMap extends Map {
  constructor() {
    super();
    this.listeners = new Set(); // 存儲更新監(jiān)聽器
  }

  set(key, value) {
    const oldValue = this.get(key);
    if (oldValue !== value) {
      super.set(key, value);
      this.notify(key, value, oldValue); // 觸發(fā)更新
    }
  }

  notify(key, newValue, oldValue) {
    this.listeners.forEach(listener => {
      listener(key, newValue, oldValue);
    });
  }

  subscribe(listener) {
    this.listeners.add(listener);
    return () => this.listeners.delete(listener); // 返回取消訂閱函數(shù)
  }
}

// 應(yīng)用:組件狀態(tài)管理
const state = new ReactiveMap();
const unsubscribe = state.subscribe((key, value) => {
  console.log(`狀態(tài)${key}更新為${value}`);
});
state.set('count', 1); // 觸發(fā)通知

場景3:大數(shù)據(jù)量的分組與統(tǒng)計(jì)

問題:對海量數(shù)據(jù)按多維度分組統(tǒng)計(jì)時(shí),傳統(tǒng)循環(huán)效率低。

方案:用 Map 作為分組容器,利用鍵的唯一性高效聚合:

// 統(tǒng)計(jì)不同部門不同性別的員工數(shù)量
const employees = [
  { dept: 'IT', gender: 'male' },
  { dept: 'IT', gender: 'female' },
  { dept: 'HR', gender: 'female' }
];

const stats = new Map();

for (const emp of employees) {
  const key = `${emp.dept}|${emp.gender}`;
  stats.set(key, (stats.get(key) || 0) + 1);
}

// 結(jié)果:Map { "IT|male" => 1, "IT|female" => 1, "HR|female" => 1 }

六、重新認(rèn)識 Map 的價(jià)值

Map 并非對象的簡單替代品,而是 JavaScript 提供的"鍵值映射"基礎(chǔ)設(shè)施。其價(jià)值在于:

  • 基礎(chǔ)層:解決對象作為映射表的固有缺陷,提供更規(guī)范的鍵值操作。
  • 應(yīng)用層:在有序存儲、復(fù)雜鍵映射、迭代處理等場景中提升開發(fā)效率。
  • 拓展層:通過封裝可實(shí)現(xiàn)雙向映射、TTL 緩存、響應(yīng)式狀態(tài)等高級功能。

二度補(bǔ)充

在 JavaScript 中,Map 的設(shè)計(jì)思想遠(yuǎn)不止前文提到的層面,其深層邏輯還涉及對“映射關(guān)系”的抽象、對“動態(tài)性”的原生支持,以及對“數(shù)據(jù)操作范式”的補(bǔ)充。這些設(shè)計(jì)思想決定了它在特定業(yè)務(wù)場景中不可替代的價(jià)值。以下從更深入的設(shè)計(jì)思想出發(fā),結(jié)合業(yè)務(wù)場景說明如何判斷何時(shí)該選擇 Map。

一、被忽視的Map設(shè)計(jì)思想:從語言本質(zhì)看價(jià)值

1. 對“映射關(guān)系”的純粹抽象

對象(Object)在 JavaScript 中是“屬性集合”,自帶原型鏈、toString 等內(nèi)置屬性,本質(zhì)上是“復(fù)合型數(shù)據(jù)載體”;而 Map 是對“鍵值映射”這一數(shù)學(xué)概念的純粹實(shí)現(xiàn)——它沒有多余的內(nèi)置屬性,唯一職責(zé)就是維護(hù)“鍵→值”的對應(yīng)關(guān)系。

設(shè)計(jì)邏輯:將“映射”從對象的復(fù)雜功能中剝離,形成單一職責(zé)的數(shù)據(jù)結(jié)構(gòu)。這種純粹性使其在需要“干凈的鍵值關(guān)聯(lián)”場景中更可靠。

2. 原生支持“動態(tài)鍵管理”

對象的鍵本質(zhì)上是靜態(tài)屬性(即使動態(tài)添加,也會受原型鏈、屬性描述符等限制),而 Map 從 API 設(shè)計(jì)上就為動態(tài)鍵場景優(yōu)化:

  • set/delete 是原子操作,且返回操作結(jié)果(便于鏈?zhǔn)秸{(diào)用或判斷執(zhí)行狀態(tài));
  • size 屬性實(shí)時(shí)反映鍵值對數(shù)量(無需通過 Object.keys().length 計(jì)算);
  • 迭代器(entries()/keys()/values())直接基于當(dāng)前狀態(tài)生成,避免遍歷過程中修改數(shù)據(jù)導(dǎo)致的異常(如對象 for...in 遍歷刪除屬性可能跳過元素)。

設(shè)計(jì)邏輯:為“鍵值對頻繁增刪、數(shù)量動態(tài)變化”的場景提供原生高效支持。

3. 對“非字符串鍵”的語義化支持

對象的鍵會被強(qiáng)制轉(zhuǎn)換為字符串(如 Symbol 作為鍵是 ES6 后補(bǔ)充的特性,且兼容性有限),而 Map 對鍵的比較采用“SameValueZero”算法(與 Object.is 邏輯一致,僅 NaN 被視為與自身相等),支持任意類型鍵的精準(zhǔn)匹配。

設(shè)計(jì)邏輯:突破“字符串鍵”的限制,讓“鍵”可以是業(yè)務(wù)語義中的“實(shí)體”(如對象、函數(shù)),而非必須轉(zhuǎn)化為字符串的“標(biāo)識”。

4. 與“迭代協(xié)議”的深度融合

Map 是原生可迭代對象(實(shí)現(xiàn)了 [Symbol.iterator]),其迭代器直接返回鍵值對,且與 for...of、擴(kuò)展運(yùn)算符(...)、Array.from 等無縫銜接。這種設(shè)計(jì)讓“遍歷映射關(guān)系”成為原生能力,無需像對象那樣先通過 Object.entries() 轉(zhuǎn)換。

設(shè)計(jì)邏輯:將“迭代”作為映射關(guān)系的基礎(chǔ)操作,降低批量處理鍵值對的成本。

二、從業(yè)務(wù)場景到Map的選擇:決策依據(jù)與實(shí)例

選擇 Map 還是對象(或其他數(shù)據(jù)結(jié)構(gòu)),核心是判斷業(yè)務(wù)場景是否匹配 Map 的設(shè)計(jì)思想。以下是典型業(yè)務(wù)場景的決策邏輯:

場景1:鍵是“業(yè)務(wù)實(shí)體”而非“字符串標(biāo)識”

業(yè)務(wù)特征:需要以對象、函數(shù)等“實(shí)體”作為鍵,而非提前定義的字符串。例如:

  • 緩存函數(shù)的計(jì)算結(jié)果(以函數(shù)和參數(shù)對象作為鍵);
  • 跟蹤 DOM 元素的狀態(tài)(以 DOM 節(jié)點(diǎn)作為鍵);
  • 關(guān)聯(lián)兩個對象的映射關(guān)系(如“用戶實(shí)例→權(quán)限實(shí)例”)。

為什么選 Map:對象的鍵會將實(shí)體轉(zhuǎn)為字符串(如 [object Object]),導(dǎo)致鍵沖突;而 Map 能精準(zhǔn)匹配實(shí)體引用。

實(shí)例:跟蹤 DOM 元素的點(diǎn)擊次數(shù)

// 錯誤方案:用對象存儲,鍵會被轉(zhuǎn)為字符串,導(dǎo)致所有元素共用一個鍵
const clickCounts = {};
document.querySelectorAll('button').forEach(btn => {
  clickCounts[btn] = 0; // 所有 btn 都會被轉(zhuǎn)為 "[object HTMLButtonElement]"
  btn.onclick = () => clickCounts[btn]++; // 所有按鈕的計(jì)數(shù)會疊加
});

// 正確方案:用 Map 精準(zhǔn)關(guān)聯(lián) DOM 元素
const clickCounts = new Map();
document.querySelectorAll('button').forEach(btn => {
  clickCounts.set(btn, 0);
  btn.onclick = () => clickCounts.set(btn, clickCounts.get(btn) + 1);
});

場景2:鍵值對需要“動態(tài)增刪且頻繁統(tǒng)計(jì)數(shù)量”

業(yè)務(wù)特征:鍵的數(shù)量不固定,需要頻繁添加/刪除,且需實(shí)時(shí)知道當(dāng)前有多少有效鍵。例如:

  • 購物車(商品可動態(tài)添加/刪除,需實(shí)時(shí)顯示商品數(shù)量);
  • 在線用戶列表(用戶隨時(shí)上下線,需實(shí)時(shí)統(tǒng)計(jì)在線人數(shù));
  • 臨時(shí)任務(wù)隊(duì)列(任務(wù)動態(tài)加入/完成,需監(jiān)控剩余任務(wù)數(shù))。

為什么選 Map:對象需通過 Object.keys(obj).length 計(jì)算數(shù)量(性能差,且會遍歷原型鏈上的屬性),而 Map.size 是原生屬性,實(shí)時(shí)更新且高效;delete 操作也更簡潔(無需 delete obj.key 這種特殊語法)。

實(shí)例:在線用戶管理

class OnlineUsers {
  constructor() {
    this.users = new Map(); // 鍵:用戶ID(number),值:用戶信息對象
  }

  userOnline(userId, info) {
    this.users.set(userId, info);
  }

  userOffline(userId) {
    this.users.delete(userId);
  }

  getOnlineCount() {
    return this.users.size; // 直接獲取,無需計(jì)算
  }

  getOnlineUsers() {
    return [...this.users.values()]; // 快速轉(zhuǎn)為數(shù)組
  }
}

場景3:需要“保留插入順序并按順序迭代”

業(yè)務(wù)特征:鍵值對的插入順序有業(yè)務(wù)意義,需按插入順序遍歷或執(zhí)行操作。例如:

  • 表單步驟流程(按用戶添加順序執(zhí)行步驟);
  • 日志記錄(按時(shí)間順序存儲,按順序打?。?/li>
  • 路由匹配規(guī)則(按注冊順序匹配優(yōu)先級)。

為什么選 Map:對象在 ES6 后雖對字符串鍵有順序優(yōu)化,但數(shù)字鍵會被優(yōu)先排序(如 { 3: 'a', 1: 'b' } 遍歷順序是 1,3),且無法保證所有場景的順序一致性;而 Map 嚴(yán)格按插入順序迭代,無例外。

實(shí)例:路由規(guī)則匹配

// 路由規(guī)則按注冊順序匹配(先注冊的規(guī)則優(yōu)先級高)
const routes = new Map();

// 注冊路由(順序:首頁 → 列表 → 詳情)
routes.set('/', () => renderHome());
routes.set('/list', () => renderList());
routes.set('/detail/:id', () => renderDetail());

// 匹配當(dāng)前路徑(按注冊順序查找第一個匹配的規(guī)則)
function matchRoute(path) {
  for (const [routePath, handler] of routes) {
    if (pathMatches(routePath, path)) { // 假設(shè)的匹配函數(shù)
      return handler();
    }
  }
}

場景4:需要“避免鍵名沖突與原型污染”

業(yè)務(wù)特征:鍵名是動態(tài)生成的(如用戶輸入、接口返回的字段),可能包含特殊值(如 __proto__、toString)。例如:

  • 存儲用戶自定義配置(鍵名由用戶輸入);
  • 緩存接口返回的動態(tài)字段(字段名不確定)。

為什么選 Map:對象的鍵若為 __proto__ 會修改原型鏈(如 obj.__proto__ = {} 會污染原型),而 Map 完全隔離于原型鏈,map.set('__proto__', 'value') 僅作為普通鍵值對存儲,無副作用。

實(shí)例:安全存儲用戶自定義配置

// 危險(xiǎn)方案:用戶輸入的鍵可能包含 __proto__
const userConfig = {};
const userInputKey = '__proto__'; // 惡意用戶輸入
userConfig[userInputKey] = 'polluted'; 
console.log({}.toString); // 可能被污染(取決于環(huán)境)

// 安全方案:用 Map 存儲,鍵名無特殊含義
const userConfig = new Map();
userConfig.set(userInputKey, 'safe'); 
console.log(Map.prototype.get('__proto__')); // undefined(無原型污染)

場景5:需要“鍵值對的批量轉(zhuǎn)換與過濾”

業(yè)務(wù)特征:需對鍵值對進(jìn)行批量處理(如過濾、映射、合并),且希望操作簡潔。例如:

  • 從現(xiàn)有映射中篩選符合條件的鍵值對;
  • 將鍵值對轉(zhuǎn)換為其他格式(如對象、數(shù)組);
  • 合并多個映射關(guān)系(去重或覆蓋)。

為什么選 MapMap 可直接通過擴(kuò)展運(yùn)算符轉(zhuǎn)為數(shù)組([...map]),無縫對接數(shù)組的 filter/map/reduce 等方法,而對象需先通過 Object.entries() 轉(zhuǎn)換,操作鏈更長。

實(shí)例:篩選并轉(zhuǎn)換符合條件的鍵值對

// 從用戶權(quán)限映射中篩選出“編輯權(quán)限”并轉(zhuǎn)為對象
const userPermissions = new Map([
  ['user1', ['read', 'write']],
  ['user2', ['read']],
  ['user3', ['write']]
]);

// 直接轉(zhuǎn)換:Map → 數(shù)組 → 過濾 → 轉(zhuǎn)為對象
const canWriteUsers = Object.fromEntries(
  [...userPermissions].filter(([_, permissions]) => permissions.includes('write'))
);
// 結(jié)果:{ user1: ['read', 'write'], user3: ['write'] }

三、總結(jié):選擇Map的核心決策框架

判斷是否用 Map,可通過以下問題快速決策:

  1. 鍵是否需要是字符串以外的類型(如對象、函數(shù)、Symbol)?→ 是 → 用 Map
  2. 鍵值對是否需要頻繁增刪,且需實(shí)時(shí)知道數(shù)量?→ 是 → 用 Map
  3. 插入順序是否對業(yè)務(wù)邏輯有影響?→ 是 → 用 Map
  4. 鍵名是否可能是動態(tài)生成的(如用戶輸入),存在沖突風(fēng)險(xiǎn)?→ 是 → 用 Map
  5. 是否需要對鍵值對進(jìn)行批量過濾、轉(zhuǎn)換等操作?→ 是 → 優(yōu)先用 Map

反之,若鍵是固定的字符串/符號、數(shù)量少且靜態(tài)、無需關(guān)注順序,則對象更簡潔(如 { name: 'xxx', age: 18 } 這種配置)。

Map 的設(shè)計(jì)思想本質(zhì)是“為動態(tài)、復(fù)雜的鍵值映射場景提供原生解決方案”,理解這一點(diǎn),就能在業(yè)務(wù)中精準(zhǔn)判斷何時(shí)該讓 Map 發(fā)揮價(jià)值。

真正的"二度回爐",是從"知道 Map"到"理解 Map 設(shè)計(jì)本質(zhì)",再到"能基于 Map 構(gòu)建符合場景的解決方案"。當(dāng)我們跳出"對象思維"的局限,Map 會成為處理復(fù)雜數(shù)據(jù)關(guān)系的強(qiáng)大工具。

到此這篇關(guān)于JavaScript Map函數(shù)的文章就介紹到這了,更多相關(guān)JS Map函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

资兴市| 大名县| 江口县| 许昌县| 姚安县| 紫云| 平舆县| 古田县| 徐闻县| 黑水县| 正安县| 徐闻县| 英超| 灵台县| 湖北省| 隆德县| 文成县| 龙里县| 赤峰市| 贵阳市| 葫芦岛市| 兴宁市| 布尔津县| 南昌县| 新安县| 德令哈市| 淳安县| 临海市| 灌云县| 九台市| 巴里| 黄冈市| 苏尼特右旗| 永修县| 五原县| 桃园县| 天水市| 陆良县| 城口县| 永修县| 彭阳县|