Как создать хеш-таблицу объектов JSON в JavaScript? - PullRequest
4 голосов
/ 12 мая 2010

Я хочу создать хеш-таблицу объектов json, где каждый объект json представляет пользователя.

Я хочу сделать это для создания клиентского «кэша» пользователей.

User { ID: 234, name: 'john', ..);

Итак, я могу ссылаться на такие вещи:

if (userCache [userid]! = Null) предупреждение (userCache [идентификатор] .id);

это возможно?

Ответы [ 4 ]

8 голосов
/ 12 мая 2010

Сами объекты 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]. (И реализации могут оптимизировать преобразование, если они могут, при условии сохранения семантики.)

Редактировать Некоторые кусочки:

Цикл по кешу

И если вы хотите пройтись по кешу (и на основе вашего дополнительного вопроса , вы сделаете, так что, возможно, другие читающие этот вопрос тоже захотят):

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);
}

Клавиши зациклены в нет определенном порядке, это зависит от браузера.

Удаление из кеша

Предположим, вы хотите полностью удалить свойство из кэша:

delete userCache['john'];

Теперь в объекте больше нет свойства "john".

0 голосов
/ 12 мая 2010

Поскольку все объекты в Javascript действительно являются словарями, вы можете сделать это несколькими способами. Один из способов может быть:

var dict = new Object;
dict.Bobby = { ID: 1, Name: "Bobby" };
if (dict.Bobby != null) alert(dict.Bobby.Name);
0 голосов
/ 12 мая 2010
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);
}
0 голосов
/ 12 мая 2010

Это почти дословно ваш код, но он работает, да:

var cache = {}
cache[234] = { id: 234, name: 'john' }

if (cache[1]) alert('Hello ' + cache[1].name);
if (cache[234]) alert('Hello ' + cache[234].name);

Или был ваш вопрос о том, как реализовать это и на стороне сервера, чтобы получить кеш пользователя для клиента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...