#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)
andHashStringToint("foo", 2)
приведет к другим результатам. Вы можете исправить это, используя постоянный размер массива, чтобы идентификация хэша одного и того же ключа была стабильной.4. В дополнение к проблемам с хешированием, не
if
setItem
перевернуто ли утверждение в? Если данный ключ существует , то в массив помещается новый элемент, если он не существует , то ключ перезаписывается.5. спасибо за ввод, но, похоже, я получил его, чтобы делать то, что я хотел сейчас
Ответ №1:
Изменение:
this.table.push([key,[value, value2]]);
Для:
this.table[idx].push([key,[value, value2]]);
Кажется, это дает мне желаемые результаты