在Javascript中使用哈希表:一个数组的数组就足够了

Using hash tables in Javascript: is an array of arrays adequate?

本文关键字:数组 一个 Javascript 哈希表      更新时间:2023-09-26

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

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 Map()?

MDN JavaScript参考: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>

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

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

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/之类的库,它们实现了对集合的一些常见操作。