覆盖JavaScript Map的相等函数

4
我想在Javascript中创建一个映射(字典),其中键是数字数组,值是一些对象。我希望从地图中检索先前存储的值,使用相同的数组内容-即,如果我有一个具有某些内容的数组,则希望为具有相同内容的数组检索(如有)先前存储的值。
在大多数其他语言中,这很容易。您将覆盖Map的相等函数,以使两个具有相同内容的数组相等。但是,在Javascript中似乎没有这样的功能。 Map键使用SameValueZero进行测试,仅当它们是同一对象时才将两个对象视为相等。
是否有一种覆盖相等性的方法?或者,在Javascript中处理此情况的另一种标准方法是什么?

1
.prototype 可能是你正在寻找的。 - Ryan Wilson
@RyanWilson 你介意详细说明一下吗? - DJClayworth
你可以通过重新定义 Array.prototype.map 来实现这个功能,但我建议看一下像 underscore 或 lodash 这样的库,它们在这方面有一些很好的功能。 - Jpec07
1
@DJClayworth 请查看用户CBusBus在此帖子(https://dev59.com/b2kv5IYBdhLWcg3wghIi)上的第三个答案,其中展示了如何使用原型。该帖子中还有其他选项可供选择,也许可以满足您的需求。 - Ryan Wilson
2个回答

1
你可以使用Proxy 来改变对象属性(也就是数组元素)的访问方式。它们让你拦截属性的读取和设置,并提供一个回调函数。
这里有一个代理数组的例子,它仅存储两个元素,并且无论你请求什么索引,都返回这两个元素中的一个。

    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


或者,你可以编写自己的类,不依赖于截取基本运算符的"神奇"特性,只需使用get(key)set(key, value)方法,以使用任何你想要的逻辑。


0
如果您不需要 Map 的特殊功能(按插入顺序迭代值),并且您的所需相等性函数可以通过比较数组的 toString() 值来实现,那么您可以使用标准对象:

const notReallyAMap = {};
notReallyAMap[[0, 1, 2]] = 'whole';
notReallyAMap[[0.5, 2.75, 6.125]] = 'rational';
notReallyAMap[[1, 2, 3, 4, 5]] = 'my luggage';

const testArray = [1, 2, 3, 4, 5];
console.log(notReallyAMap[testArray]);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接