我想创建一个json对象的哈希表,其中每个json对象代表一个用户。
我想这样做是为了创建用户端的“缓存”。
User { ID: 234, name: 'john', ..);
所以我可以参考这样的事情:
if(userCache [userid]!= null) 警报(userCache [用户id] .ID);
这可能吗?
答案 0 :(得分:8)
Javascript对象本身就是地图,例如:
var userCache = {};
userCache['john'] = {ID: 234, name: 'john', ... };
userCache['mary'] = {ID: 567, name: 'mary', ... };
userCache['douglas'] = {ID: 42, name: 'douglas', ... };
// Usage:
var id = 'john';
var user = userCache[id];
if (user) alert(user.ID); // alerts "234"
(我不清楚你的“用户名”是“john”还是234,所以我选择上面的“john”,但如果你愿意,可以使用234.)
这取决于如何存储密钥以及地图是哈希映射还是其他结构的实现,但我已经完成了数百个对象,并且对性能非常满意,即使在IE上,这也是其中一个较慢的实现(目前)。
这是有效的,因为有两种方法可以获取Javascript对象的属性:通过点分表示法,并通过括号表示法。例如:
var foo = {bar: 10};
alert(foo.bar); // alerts "10"
alert(foo['bar']); // alerts "10"
alert(foo['b' + 'a' + 'r']); // alerts "10"
s = "bar";
alert(foo[b]); // alerts "10"
这种用于获取对象属性的方括号语法与通过索引获取数组元素相同似乎很奇怪,但事实上,数组索引是Javascript中的对象属性。属性名称始终是字符串(理论上),但在执行user[234]
之类的操作时会发生自动转换。 (如果可以的话,实现可以自由地优化转换,只要保持语义。)
编辑一些点点滴滴:
如果您想循环缓存(并且基于your follow-up question,那么您也可以这样做,所以也许其他人也会想要阅读这个问题):
var key, user;
for (key in userCache) {
// `key` receives the name of each property in the cache, so "john",
// "mary", "douglas"...
user = userCache[key];
alert(user.ID);
}
密钥以 no 定义的顺序循环,因浏览器而异。
假设您要完全从缓存中删除属性:
delete userCache['john'];
现在对象中不再存在“john”属性。
答案 1 :(得分:0)
这几乎是你的代码的逐字记录,但它确实有效,是的:
var cache = {}
cache[234] = { id: 234, name: 'john' }
if (cache[1]) alert('Hello ' + cache[1].name);
if (cache[234]) alert('Hello ' + cache[234].name);
或者您是如何在服务器端实现此问题,以获取用户缓存到客户端?
答案 2 :(得分:0)
function findUser(users, userid) {
for (var i = 0; i < users.length; i++) {
if (users[i].ID === userid) {
return users[i];
}
}
return null;
}
var users = [{ ID: 234, name: 'john' }, { ID: 235, name: 'smith' }];
var user = findUser(users, 235);
if (user != null) {
alert(user.name);
}
答案 3 :(得分:0)
由于Javascript中的所有对象都是字典,因此您可以通过几种方式执行此操作。 一种方法可能是:
var dict = new Object;
dict.Bobby = { ID: 1, Name: "Bobby" };
if (dict.Bobby != null) alert(dict.Bobby.Name);