重写 Javascript Map 的相等函数

DJC*_*rth 5 javascript dictionary

我想在 Javascript 中创建一个 Map(字典),其中键是数字数组,值是某个对象。我想从地图中检索以前使用相同数组内容存储的值 - 即,如果我有一个包含某些内容的数组,我想检索以前为具有相同内容的数组存储的值(如果有)。

在大多数其他语言中,这很容易。您可以重写 Map 的相等函数,以便测试具有相同内容的两个数组相等。这似乎不可用 Javascript。映射键正在使用 SameValueZero 进行测试,它仅在两个对象是同一对象时才认为它们相等。

有没有一种方法可以覆盖相等性,或者是否有另一种标准方法可以在 Javascript 中处理这种情况?

Ale*_*yne 1

您可以使用 aProxy来更改对象属性(也意味着数组元素)的访问方式。它们允许您通过回调拦截属性获取和设置。

下面是一个代理数组的示例,它仅存储两个元素,并且无论您要求什么索引,都返回这两个元素之一。

    const arr = new Proxy([], {
      get: function(self, prop) {
        const index = parseInt(prop, 10)
        // If the property is not a number, then no special handling
        if (isNaN(index)) {
          return self[prop]
        }
        
        if (index % 2 === 0) {
          // even
          return self[0]
        } else {
          // odd
          return self[1]
        }
      }
    })
    
    // Add just two elements
    arr.push('even')
    arr.push('odd')
    
    // Get any index
    console.log(arr[0]) // even
    console.log(arr[1]) // odd
    console.log(arr[2]) // even
    console.log(arr[301]) // odd
Run Code Online (Sandbox Code Playgroud)


或者,您可以编写自己的类,该类不依赖于拦截基本运算符的“魔力”,而只具有get(key)使用set(key, value)您想要的任何逻辑的方法。