在 Javascript 中使用哈希表:数组的数组是否足够?
Using hash tables in Javascript: is an array of arrays adequate?
我需要 hash table in 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)
会失败,因为它不是 "formal parameter"。但是通过做类似的事情:
hash.push({'key':key_string,'value':val_array})
如何通过关联键以最简单的方式访问其中一个数组?
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 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>
我需要 hash table in 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)
会失败,因为它不是 "formal parameter"。但是通过做类似的事情:
hash.push({'key':key_string,'value':val_array})
如何通过关联键以最简单的方式访问其中一个数组?
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 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>