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
相关产品推荐
相关产品推荐

