【问题标题】:Mapping multiple keys to the same value in a Javascript hash将多个键映射到 Javascript 哈希中的相同值
【发布时间】:2010-03-24 21:20:31
【问题描述】:

我使用一个Javascript hash对象来存储一组数值计数器,这样设置[这个大大简化了]:

var myHash = {
    A: 0,
    B: 0,
    C: 0
};

有没有办法让其他键(未在myHash 中明确显示的键)映射到那些键?例如,我想[再次,这是简化的]:

myHash['A_prime']++; // or myHash.A_prime++;

完全等价于

myHash['A']++; // or myHash.A++;

例如递增在键 A 上找到的值,而不是 A_prime

【问题讨论】:

    标签: javascript hash associative-array


    【解决方案1】:

    假设此哈希中没有任何有效的字符串值,您可以在哈希本身内创建自己的键到其他键的映射,并将键/值对包装在您自己的函数中,如下所示:

    var hash = {
        A: 0,
        B: 0,
        C: 0,
        A_asdf: 'A',
        B_asdf: 'B',
        A_another: 'A'
    }
    
    function increment(key)
    {
        // iteratively find the real key
        while (typeof(hash[key]) == 'string')
        {
            key = hash[key];
        }
        hash[key]++;
    }
    

    【讨论】:

    • 虽然我最终不需要实现这样的东西,但我接受了你的回答,因为它对我来说似乎是最干净、最灵活的。
    • 我喜欢这个想法,这就像在哈希中创建一组变量.. 这很容易成为一个类
    【解决方案2】:

    解决此问题的一种方法是将所有值包装在一个对象中,并在多个键中使用该对象。

    var myHash = {
        A: {value: 0},
        ...
    };
    
    myHash['A_prime'] = myHash['A'];
    myHash['A_prime'].value++;
    

    【讨论】:

      【解决方案3】:

      我认为您最好只编写一个函数来完成一个或多个哈希数组的递增,具体取决于您要完成的任务。我可能没有正确理解这个问题,但这是我的解决方案。

      var smallHash = { 
          A: 0, 
          B: 0, 
          C: 0,
          A_prime:'A',
          B_prime:'B',
          C_prime:'C'
      }; 
      
      function incrementPrime(myHash,key)
      {
        letterKey = myHash[key];
        myHash[letterKey]++;
      }
      
      incrementPrime(smallHash,'C_prime');
      
      alert("C is now: "+smallHash['C']); // should return 1
      

      【讨论】:

        【解决方案4】:

        您可以对密钥进行操作,而不是哈希:

        var myHash = {
            A: 0,
            B: 0,
            C: 0
        };
        function incr(prop){
            myHash[prop[0]]++;
        }
        incr('A');
        incr('A_asdf');
        

        函数incr 可以是您想要应用于哈希的任何其他内容。

        【讨论】:

          【解决方案5】:

          如上所述,没有。如果您可以将键更改为对象,尽管您会更接近:

          var x = new Object();
          var y = x;
          
          myHash[x] = 1;
          myHash[y]++;  // should increment the value since y is x.
          

          【讨论】:

          • JavaScript 不能将对象作为键,只能作为字符串。 myHash 对象将以名为 "[object Object]" 的属性结尾,因为 [] 属性访问器运算符会将 xy 转换为字符串。
          • 我可以控制哈希,但不能控制密钥。我的问题是,考虑到我的钥匙的限制,我是否可以做我想做的事。
          • 每天学习新东西。
          猜你喜欢
          • 2015-12-26
          • 1970-01-01
          • 2018-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-08
          • 2020-12-14
          • 2020-03-12
          相关资源
          最近更新 更多