在Javascript中使用哈希表:一个数组的数组就足够了
Using hash tables in Javascript: is an array of arrays adequate?
我需要一个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/之类的库,它们实现了对集合的一些常见操作。
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- JavaScript数组包含一个值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- jQuery$.inArray()总是返回-1和一个对象数组
- 在数组中的一个元素上设置多个值
- javascript处理一个对象数组以获得一个新的对象数组
- 作为一个二维数组,从ajax接收
- 你能用来自数组的属性名称生成一个对象吗
- 多维关联数组的最后一个索引
- 如何创建一个方法来验证数组的范围
- 循环以检查数组中的最后一个图像
- 在Javascript中将一个值和字符串数组转换为if语句
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 如何将一个对象添加到每个对象数组中
- 如何创建一个谷歌地图地理坐标数组
- 如何从另一个带下划线的数组中筛选带元素的数组
- 使用window.location.htm和匹配的URL数组(一个用于桌面,一个用于移动)将桌面网站重定向到移动
- Javascript排序多维数组-一个完整的例子
- 刽子手的游戏.2数组.一个需要相应地更新另一个