javascript - 调整 ES2015 Map 以支持所需的行为

标签 javascript typescript ecmascript-6

我正在使用 ES2015 map ,我发现它是一个很棒的功能。但是,我现在有一个用例,我不太确定是否可以使用 map 。

考虑我的类(class)

class A {
     constructor(public a:number) {}
     public equals(obj: A): boolean {
         return this.a === obj.a;
     }
 }

据我所知,ES2015 map 将使用 === 相等运算符(有一些异常(exception))。因此我想知道是否有可能覆盖相等性并强制它使用 A 对象的 equals(...) 方法 if instanceof?

最终这就是我想要实现的:

var map = new Map();
map.set(new A(8), 7)
map.get(new A(8))      // return 7, not undefined

你认为我必须创建自己的 Map 类来实现这种检查两个对象是否都是 A 实例然后调用 equals(...) 的行为吗? > 方法?

最佳答案

您可以根据需要创建子类并覆盖 get 方法:

class MapByEquals extends Map {
  get(key) {
    for(var k of this.keys()) {
      if(key.equals(k)) {
        return super.get(k);
      }
    }
    return super.get(key);
  }
}

"use strict";
class A {
  constructor(a) {
    this.a = a;
  }
  equals(b) {
    return this.a === b.a;
  }
}

class MapByEquals extends Map {
  get(key) {
    for(var k of this.keys()) {
      if(key.equals(k)) {
        return super.get(k);
      }
    }
    return super.get(key);
  }
}

var map = new MapByEquals();
map.set(new A(8), 7)
console.log(map.get(new A(8)))

请注意,Babel 不支持原生类扩展。但是大多数浏览器(Chrome 42+、Firefox 45+)本身就支持类并且它会起作用。

关于javascript - 调整 ES2015 Map 以支持所需的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36107162/

相关文章:

javascript - 输入空格时如何触发 ng-change?

javascript - Angular2 Observable 不是由异步管道触发的

javascript - 如何将元素的背景位置更改为新的 CSS 属性?

javascript - 响应式设计 : Below 768px , 我的横幅图片非常拉伸(stretch)。我试过 height=auto,但 IE9 根本不显示它们

angularjs - 模块 'angular' 没有导出成员 'material'

javascript - 根据嵌套对象过滤嵌套对象数组

javascript - 如何使用 Meteor 通过动态路径导入

javascript - 在 Express 中使用 ES6 模块

javascript - Cycle.js 应用程序未捕获的类型错误

javascript - 使用新 Set 删除数组中的重复项会出错