Привет всем! Я пытаюсь сделать небольшой словарь с использованием JSON и JavaScript. Вот как выглядит мой JSON-файл:
[
{
"слово": "гордый",
"синонимы": ["величественный", "благородный"]
}
]
Мне нужно, чтобы пользователь мог искать как по основному слову (например, “гордый”), так и по любому из синонимов, и получать результаты. Вот мой JavaScript-код:
const поле = document.getElementById("поле");
async function найтиСлова() {
const ответ = await fetch('./словарь.json');
const данные = await ответ.json();
данные.forEach(элемент => {
if (поле.value === элемент.слово || элемент.синонимы.includes(поле.value)) {
console.log(элемент.слово);
console.log(элемент.синонимы);
}
});
}
Как мне правильно реализовать такой поиск? Может, есть более эффективный способ? Буду благодарен за любую помощь!
Могу предложить еще один вариант оптимизации. Создай объект-индекс, где ключами будут все слова и синонимы, а значениями - соответствующие элементы массива. Это ускорит поиск:
const индекс = {};
данные.forEach(элемент => {
индекс[элемент.слово] = элемент;
элемент.синонимы.forEach(синоним => {
индекс[синоним] = элемент;
});
});
function поиск(запрос) {
return индекс[запрос.toLowerCase()] || null;
}
Такой подход даст O(1) сложность поиска вместо O(n). Для больших словарей разница будет ощутима.
Твой подход в целом верный, но можно оптимизировать. Попробуй использовать метод some()
для проверки синонимов - это сделает код чище. Еще советую добавить приведение к нижнему регистру, чтобы поиск работал независимо от регистра. А для вывода результатов лучше использовать DOM, а не консоль. Так пользователю будет удобнее. Если нужно, могу показать пример кода.
твой код уже неплохо работает, но можно сделать еще лучше! я бы посоветовал использовать метод filter() вместо forEach() - так ты сразу получишь массив совпадений. и еще можно добавить нечеткий поиск, чтобы находить похожие слова. вот примерно как это может выглядеть:
const результаты = данные.filter(элемент => {
const поисковыйЗапрос = поле.value.toLowerCase();
return элемент.слово.toLowerCase().includes(поисковыйЗапрос) ||
элемент.синонимы.some(синоним => синоним.toLowerCase().includes(поисковыйЗапрос));
});
так поиск будет работать даже если ввести часть слова. надеюсь, это поможет!