代码之家  ›  专栏  ›  技术社区  ›  DJClayworth

重写Javascript映射的相等函数

  •  0
  • DJClayworth  · 技术社区  · 7 年前

    我想用Javascript创建一个映射(字典),其中它们的键是一个数字数组,值是某个对象。我想从映射中检索以前使用相同数组内容存储的值,也就是说,如果我有一个包含某些内容的数组,我想检索以前为具有相同内容的数组存储的值(如果有)。

    在大多数其他语言中,这很容易。您将重写映射的相等函数,以便具有相同内容的两个数组被测试为相等。这似乎不是可用的Javascript。地图键正在使用SameValueZero进行测试,它只会在两个对象是同一个对象的情况下将它们视为相等的。

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   AuxTaco    7 年前

    如果你不需要 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]);
        2
  •  0
  •   Alex Wayne    7 年前

    你可以用 Proxy 更改对象属性(也就是数组元素)的访问方式。它们允许您通过回调截获属性get和set。

    下面是一个代理数组的示例,它只存储两个元素,并返回这两个元素中的一个,而不管您需要什么索引。

        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) 使用任何逻辑的方法。