С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.08.2021
Сообщений: 72

Как мне реализовать ?

24.02.2023, 11:33. Показов 339. Ответов 0

Студворк — интернет-сервис помощи студентам
Есть поле ввода (input), при вводе первых 2-3 букв или цифр, должны выходить подсказки, снизу. Нужен скрипт на JS, который будет подтягивать подсказки из файла json (краткая версия в прикреплении). Поиск совпадений должен осуществляться во всех словах, которые есть в файле, но подсказки должны формироваться из названия разделов, которые находятся в атрибуте "name", по иерархии находящиеся после второго "items" (показано в скрине 2). Далее, если пользователь выбрал одну из подсказок, скрипт должен подтянуть и показать (в отдельном блоке), все данные из массива, которые находятся ниже, по иерархии, после атрибута "items". Пример файла json в прикреплении к заданию. Также, нужно сделать возможность, клиенту, вводить повторно, в поле ввода буквы или цифры, для поиска нужного раздела, сколько угодно раз.

Плюс ко всему, если клиент вводит цифры, то, при вводе, минимум, двух цифр, скрипт должен искать совпадения, только с начала строки, в атрибуте "code" со значениями не более 4-х цифр. Там где значение атрибута "code" больше 4-х цифр, это значение не должно показываться в подсказке. В подсказке должно быть, с начала цифра из атрибута "code" потом двоеточие и после быть значение атрибута "name", который идёт после соответствующего атрибута "code".

Также, если клиент вводит запятую вместо точки, то скрипт должен приравнять их и всё равно выполнять поиск.
Написал данный скрипт
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
<head>
  <title>Поиск элементов</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    #search-input {
      padding: 8px;
      font-size: 16px;
      width: 100%;
      box-sizing: border-box;
    }
    #search-results {
      list-style: none;
      margin: 0;
      padding: 0;
    }
    #search-results li {
      padding: 8px;
      font-size: 16px;
      border-bottom: 1px solid #ccc;
    }
    #search-results li.category {
      font-weight: bold;
      background-color: #f0f0f0;
    }
    #item-details {
      margin-top: 16px;
      padding: 8px;
      font-size: 16px;
      border: 1px solid #ccc;
    }
  </style>
</head>
<body>
  <input id="search-input" type="text" placeholder="Введите поисковый запрос...">
  <ul id="search-results"></ul>
  <div id="item-details"></div>
  <script src="script.js"></script>
</body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
const searchInput = document.getElementById('search-input');
const searchResults = document.getElementById('search-results');
const itemDetails = document.getElementById('item-details');
 
 
let data = {
  "items": [
    {
      "name": "Fruits",
      "code": "1001",
      "items": [
        {
          "name": "Apple",
          "code": "1001.01"
        },
        {
          "name": "Banana",
          "code": "1001.02"
        },
        {
          "name": "Orange",
          "code": "1001.03"
        }
      ]
    },
    {
      "name": "Vegetables",
      "code": "1002",
      "items": [
        {
          "name": "Carrot",
          "code": "1002.01"
        },
        {
          "name": "Tomato",
          "code": "1002.02"
        },
        {
          "name": "Potato",
          "code": "1002.03"
        }
      ]
    },
    {
      "name": "Beverages",
      "code": "1003",
      "items": [
        {
          "name": "Coffee",
          "code": "1003.01"
        },
        {
          "name": "Tea",
          "code": "1003.02"
        },
        {
          "name": "So",
          "code": "1003.03"
        }
      ]
    }
  ]
};
 
// Функция для формирования списка подсказок
function showSearchResults(results) {
  // Очистка списка подсказок
  searchResults.innerHTML = '';
  // Добавление элементов в список подсказок
  for (let i = 0; i < results.length; i++) {
    const li = document.createElement('li');
    const item = results[i];
    // Проверка, является ли элемент разделом (имеет ли он дочерние элементы)
    const isCategory = item.items && item.items.length > 0;
    // Формирование подсказки
    let suggestion = '';
    if (item.code && item.name) {
      suggestion = item.code + ': ' + item.name;
    } else if (item.name) {
      suggestion = item.name;
    }
    // Добавление класса "category" для разделов
    if (isCategory) {
      li.classList.add('category');
    }
    // Добавление элемента в список подсказок
    li.textContent = suggestion;
    searchResults.appendChild(li);
    // Добавление обработчика клика на элементы списка подсказок
    li.addEventListener('click', function() {
      // Очистка списка подсказок
      searchResults.innerHTML = '';
      // Отображение подробной информации о выбранном элементе
      showItemDetails(item);
    });
  }
}
 
// Функция для поиска элементов
function searchItems(query) {
  // Проверка, есть ли данные для поиска
  if (!data) {
    return [];
  }
  // Разбивка запроса на слова
  const words = query.toLowerCase().split(' ');
  // Фильтрация элементов, удовлетворяющих хотя бы одному из слов
  const filtered = data.items.filter(function(item) {
    const text = (item.code || '') + ' ' + (item.name || '');
    return words.every(function(word) {
      return text.toLowerCase().indexOf(word) >= 0;
    });
  });
  // Сортировка элементов по весу и алфавиту
  const sorted = filtered.sort(function(a, b) {
    const weightDiff = (b.weight || 0) - (a.weight || 0);
    if (weightDiff !== 0) {
      return weightDiff;
    } else if (a.name && b.name) {
      return a.name.localeCompare(b.name);
    } else {
      return 0;
    }
  });
  // Ограничение количества результатов
  const limit = 10;
  const sliced = sorted.slice(0, limit);
  // Возврат отфильтрованных и отсортированных элементов
  return sliced;
}
 
// Функция для отображения
 
searchInput.addEventListener('input', (e) => {
  e.preventDefault();
  const findItems =  searchItems(e.target.value)
  showSearchResults(findItems);
})
При вводе ban он не выдает ничего, хотя должен выдать 1001: Fruits и подсказки должны показываться после ввода минимум буквенных 3 символа, а по цифрам минимум 2
И при выборе какой либо подсказки, должно появляться, отдельный блок, в виде текста, где будет указано в этой категории. Например, если выбрали 1001: Fruits, то должно появиться: Apple, Banana, Orange Как реализовать или прописать в коде ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2023, 11:33
Ответы с готовыми решениями:

Как мне реализовать Массив в JS?
Дан массив, содержащий заработную плату лучших работников фабрики. Менеджер решил повысить им заработную плату на определенный процент, и...

Подскажите как мне реализовать данный код
Подскажите как мне реализовать данный код? var menu = angular.element(document.querySelectorAll(&quot;.mane-menu__element&quot;));...

Как мне реализовать столкновение по вертикали?
Пытаюсь сделать игрульку с управлением WASD и видом сверху. Коллизия работает только для лево, право, верх, низ корректно. Но вот когда я...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2023, 11:33
Помогаю со студенческими работами здесь

Как мне реализовать Dial по нажатию
Всем привет! Котлин посл.версия установлена. Постараюсь объяснить. Делаю проект. Задача: как чтобы по нажатию на номер телефона...

Как мне реализовать сортировку массива на форме?
obj:=TArrClass.Two(stg2.ColCount); for i:=0 to Length(obj.mas)-1 do begin for j:=i+1 to Length(obj.mas)-1 do ...

Как мне правильно реализовать связь между таблицами
Имеются такая вот схема данных, точнее ее часть (смотрите во вложениях) Не устраивает меня связь заказы - расшифровки. Согласно...

Объясните мне, как реализовать разделённый доступ, пожалуйста
Вечер добрый, господа. Ситуация такая. У меня есть кривая БД, сделанная в MS Access, и кривая Форма, сделанная на Windows Forms C#, и к ним...

Как мне реализовать перевод числа из семеричной системы в ascii код
Не могу реализовать программу, так как не понимаю как перевести из семеричной в десятичную, а из десятичной в ascii код. Очень надеюсь на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru