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

JavaScript类字典中,如何高效实现键值的列表追加逻辑?

JavaScript 高效实现字典列表追加逻辑

你需要给类中的字典结构实现「无则建键存列表,有则追加值」的逻辑,以下几种高效简洁的实现方式供你参考:

1. 空值合并赋值(ES2020+ 推荐)

这种写法逻辑精准、代码最简洁,利用ES2020新增的??=运算符,仅当键对应值为undefined或null时才初始化数组:

class MyDict {
  constructor() {
    this.dict = {};
  }

  addValue(key, value) {
    // 若key不存在则初始化空数组
    this.dict[key] ??= [];
    this.dict[key].push(value);
  }
}

2. 短路求值(兼容旧环境)

如果需要兼容不支持ES2020的环境,可利用逻辑或的短路特性实现,写法同样简洁:

class MyDict {
  constructor() {
    this.dict = {};
  }

  addValue(key, value) {
    // 短路逻辑:存在则用原数组,不存在则新建数组
    (this.dict[key] || (this.dict[key] = [])).push(value);
  }
}

注意:这种写法会把空数组[]也视为「不存在」(因为空数组是假值),如果你的场景中可能出现键对应空数组的情况,建议用第一种方法。

3. Map 结构实现(键类型灵活)

如果字典键需要支持对象、Symbol等非字符串类型,或者需要频繁增删键值对,用Map比普通对象更合适,性能表现也更稳定:

class MyDict {
  constructor() {
    this.dict = new Map();
  }

  addValue(key, value) {
    let arr = this.dict.get(key);
    if (!arr) {
      arr = [];
      this.dict.set(key, arr);
    }
    arr.push(value);
  }
}

也可以简化成一行(但性能略低于上面的写法,因为每次都要展开数组):

class MyDict {
  constructor() {
    this.dict = new Map();
  }

  addValue(key, value) {
    this.dict.set(key, [...(this.dict.get(key) || []), value]);
  }
}

效率对比

  • 普通对象的两种写法性能几乎无差异,都比显式if-else更简洁(性能差异极小,可忽略)。
  • Map在复杂键类型、大量键值对的场景下,增删查的效率优于普通对象。

内容的提问来源于stack exchange,提问作者Lavnish Chaudhary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:01:09