我需要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;
也许是因为在我添加新值之后声明的数组似乎没有被正确映射(打开你的控制台并点击+
按钮,你可以看到值即使显示{ {1}})。 [s1]
一直假设数组只有一个值,但如果我直接访问这些键中的任何一个,例如forEach
,返回相应的数组。
因此,我做错了什么?我应该使用这种方法吗?
<小时/> 如果JSON中的对象更适合这种情况,那么实现简单且类似于上述示例的最佳方法是什么?
此外,如果hash['s3']
是我想要的字符串,那么key_string
会失败,因为它不是&#34;形式参数&#34;。但是做了类似的事情:
hash.push(key_string: val_array)
如何通过其关联密钥以最简单的方式访问其中一个阵列?
答案 0 :(得分:1)
为什么不能使用JavaScript 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/这样的库来实现对集合的许多常见操作。