在Javascript中使用哈希表:数组是否足够?

时间:2016-10-03 17:52:54

标签: javascript arrays hashtable

我需要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>';
}
&#13;
<p id="foreach">forEach (val,index):<br/></p>
<p id="for">for:<br/></p>
&#13;
&#13;
&#13;

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

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

<小时/> 如果JSON中的对象更适合这种情况,那么实现简单且类似于上述示例的最佳方法是什么?

此外,如果hash['s3']是我想要的字符串,那么key_string会失败,因为它不是&#34;形式参数&#34;。但是做了类似的事情:

hash.push(key_string: val_array)

如何通过其关联密钥以最简单的方式访问其中一个阵列?

3 个答案:

答案 0 :(得分:1)

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

MDN JavaScript Reference: Map

我修改了下面的代码,使用Map代替数组:

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>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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/这样的库来实现对集合的许多常见操作。