Реализация хеш-таблицы в Javascript

#javascript #hashtable

#javascript #хеш-таблица

Вопрос:

У меня возникли проблемы с написанием метода получения моего хэш-класса на основе того, что у меня есть в классе setter.

Ошибка, которую я получаю, это: error: Uncaught TypeError: Cannot read property '1' of undefined

 setItem = (key, value, value2) => {
    const idx = HashStringToInt(key, this.table.length);
    if (this.table[idx]) {
        this.table.push([key,[value, value2]]);
    } else {
        this.table[idx] = [[key, [value, value2]]]
    }        
}

getItem = key => {
    const idx = HashStringToInt(key, this.table.length);

    if (!this.table[idx]) {
        return null;
    }
    return this.table[idx].find(x => x[0] === key)[1]; //this doesn't work
}
 

Комментарии:

1. Если вы переходите this.table.length к своей хэш-функции и продолжаете изменять длину, как вы ожидаете получить одни и те же хэши до и после добавления элемента?

2. Я понимаю, о чем вы говорите, но как тогда я могу написать это, чтобы, по сути, ключ переходил к двум значениям a = b, c?

3. Если вам нужно два значения для каждого ключа, то стандартной хэш-таблицы bog, в которой вы храните массивы из двух элементов, кажется достаточным. Проблема здесь не в количестве значений, а в том, что хеширование нестабильно — после того, как вы нажмете на массив, любые будущие пересчеты хэша будут принимать новую длину массива. Я не знаю вашей реализации хеширования, но кажется разумным предположение, что HashStringToInt("foo", 1) and HashStringToint("foo", 2) приведет к другим результатам. Вы можете исправить это, используя постоянный размер массива, чтобы идентификация хэша одного и того же ключа была стабильной.

4. В дополнение к проблемам с хешированием, не if setItem перевернуто ли утверждение в? Если данный ключ существует , то в массив помещается новый элемент, если он не существует , то ключ перезаписывается.

5. спасибо за ввод, но, похоже, я получил его, чтобы делать то, что я хотел сейчас

Ответ №1:

Изменение:

 this.table.push([key,[value, value2]]);
 

Для:

 this.table[idx].push([key,[value, value2]]);
 

Кажется, это дает мне желаемые результаты