【问题标题】:Using hash tables in Javascript: is an array of arrays adequate?在 Javascript 中使用哈希表:数组数组是否足够?
【发布时间】:2017-02-11 18:00:05
【问题描述】:

我需要一个 Javascript 中的 hash table,即实现一个关联数组,它将键(字符串)映射到值(在我的例子中,这些是几个整数数组)。我意识到这种方法并不常用,或者至少我还没有在网上找到它:

var hash = ['s0'];
for (var i = 5; i >= 1; i--) {
  var r = Math.floor(Math.random() * 3);
  hash['s'+i] = [r, r*2, r^2];
}
console.log(hash);
hash.forEach(function (v, i, a) {
  document.getElementById('foreach').innerHTML += i + ' => ' + v + '<br>';
})
for (var i = 5; i >= 1; i--) {
  var key = 's'+i;
  document.getElementById('for').innerHTML += key + ' => [' + hash[key].toString() + ']<br>';
}
<p id="foreach">forEach (val,index):<br/></p>
<p id="for">for:<br/></p>

可能是因为在我添加新值后声明的数组似乎没有正确映射(打开控制台并单击+ 按钮,即使显示[s1],您也可以看到值在那里)。 forEach 一直假设数组只有一个值,但如果我直接访问这些键中的任何一个,例如hash['s3'],返回对应的数组。

因此,我做错了什么吗?我什至应该使用这种方法吗?


如果 JSON 中的对象更适合这种情况,那么实现与上面示例类似的简单方法的最佳方法是什么?

此外,如果key_string 是我想要作为键的字符串,hash.push(key_string: val_array) 会失败,因为它不是“形式参数”。但是,通过执行以下操作:

hash.push({'key':key_string,'value':val_array})

如何通过关联的键以最简单的方式访问其中一个数组?

【问题讨论】:

  • javascript 对象属性的作用与哈希表或关联数组大致相同,在 javascript 中实现哈希表要么是解决您要解决的任何问题的错误方法,要么是一个家庭作业问题。
  • 将 var hash=['s0'] 更改为 var hash = {'s0':'first_element'};看看它做了什么
  • 感谢@chiliNUT,但是如果对象属性“与哈希表的作用大致相同”并且如果通过“作业问题”您说这是一个“微不足道的问题”,您能否提供一个简单的哈希表问题的替代方案?我正在使用与上述类似的代码,它适用于我的目的,但不能使用 forEach...
  • 没有“JSON 对象”之类的东西,顺便说一下,只有 JSON(它是一个字符串)和一个 Object 对象......
  • 感谢@VladimirM,我已经尝试过 Object 方法,如果您注意到问题末尾的小写字母,使用动态键 (key_string) 对我不起作用。

标签: javascript arrays hashtable


【解决方案1】:

为什么不能使用 JavaScript Map()?

MDN JavaScript Reference: Map

我在下面修改了您的代码以使用 Map 而不是 Array:

var map = new Map();
for (var i = 5; i >= 1; i--) {
  var r = Math.floor(Math.random() * 3);
  map.set('s'+i, [r, r*2, r^2]);
}
console.log(map);
map.forEach(function (v, i, m) {
  document.getElementById('foreach').innerHTML += i + ' => ' + v + '<br>';
})
for (var i = 5; i >= 1; i--) {
  var key = 's'+i;
  document.getElementById('for').innerHTML += key + ' => [' + map.get(key).toString() + ']<br>';
}
<p id="foreach">forEach (val,index):<br/></p>
<p id="for">for:<br/></p>

【讨论】:

  • 好的!我知道我错过了一些东西!真的很感激。
【解决方案2】:

Javascript 的对象类型涵盖了您正在寻找的所有行为:

var obj = {};
for (var i = 5; i >= 1; i--) {
    var r = Math.floor(Math.random() * 3);
    obj['s'+i] = [r, r*2, r^2];
}

关于 Javascript 中的对象类型很酷的一点是,您可以使用关联的类似数组的语法或使用点表示法来访问属性。

obj['key'] === obj.key

【讨论】:

    【解决方案3】:

    请在控制台中检查此示例。

    var hash = {'s0':' '};
    for (var i = 5; i >= 1; i--) {
      var r = Math.floor(Math.random() * 3);
      hash['s'+i] = [r, r*2, r^2];
    }
    

    看到哈希对象现在包含键值映射

    console.log(hash);
    

    要使用 forEach 访问对象,您可以将对象的键提取为数组并对其进行迭代:

    Object.keys(hash).forEach(function (v, i, a) {
      console.log( i , v, hash[v] );
    })
    

    您也可以开始使用诸如 https://lodash.com/ 之类的库,它们对集合实现了许多常见操作。

    【讨论】:

    • 请添加一些解释为什么此代码有助于 OP。这将有助于为未来的观众提供一个可以学习的答案。请参阅How to Answer 了解更多信息。
    猜你喜欢
    • 2017-04-13
    • 2017-04-28
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2012-09-02
    • 2015-11-27
    相关资源
    最近更新 更多