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

IndexedDB: Поиск записей под подстроке

31.10.2025, 12:36. Показов 1130. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Будьте добры, кто работал с indexedDB не подскажите: никак не получается найти интервал записей до ___ ВКЛЮЧИТЕЛЬНО, т.е. мне нужно найти все записи, начинающиеся на букву Б с заданием интервала от 'Б' до 'Б'.
В моем примере
req = xr.openCursor(IDBKeyRange.bound("Б", "В")) // Выводит все на букву "Б",
а надо типа
req = xr.openCursor(IDBKeyRange.bound("Б", "Б", true, false)) - но увы данная конструкция почему то не срабатывает

Пример кода:
HTML5
1
2
3
4
5
 <br>1. <button onclick = "imp_mFilm ();" class="kn1" > массив→iDB  </button>
 <br>2. <button onclick = "get_fi ();" class="kn1" > "Б"→ti </button>   
 
<br><br>
 <span id="inf1" class= "abs" style="color: darkblue;"> inf1    </span>
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
 let idb_nam_db= ["myBase", 1];
 let nm_xr= "film";
 let idb_db;        // db
 
 promise = idb_open();  
 
 
function idb_open ()  {
return new Promise(function(resolve, reject) {
 
 const openRequest = indexedDB.open(idb_nam_db[0], idb_nam_db[1]); 
 
 openRequest.onupgradeneeded = function() {
    let db = openRequest.result;
    let xr= db.createObjectStore(nm_xr, {keyPath: 'nam_film'}); 
 };
 
    openRequest.onsuccess = () => {
        console.log(`database ${idb_nam_db[0]} Версия: ${idb_nam_db[1]} open`);
        idb_db = openRequest.result; 
        resolve(openRequest.result)
    };
    
})
}
 
 
function imp_mFilm ()   {       // , zn_pol, kl
 
 let ob_in= {};
 const m_in = [
 "Афера",
 "Аватар",
 "Васаби",
 "Блеф",
 "Гром небесный",
 "Долг",
 ];
 
 
 let tr = idb_db.transaction(nm_xr, 'readwrite');
 let xr = tr.objectStore(nm_xr);
 let req;
 
 for (let i= 0; i< m_in.length; i++) {
    ob_in.nam_film= m_in [i];
    req = xr.add(ob_in); // (3)     // request
 }
 
    req.onsuccess = function() {
        console.log("imp_mFilm │ add nam_film="+ ob_in.nam_f, req.result);
    };
    req.onerror = function() {
        console.log("Ошибка", req.error);
    }
 
}
 
 
 
function get_fi () {
 
 let rec = document.querySelector("#inf1");
 
 tr = idb_db.transaction(nm_xr);
 xr = tr.objectStore(nm_xr);
 
 //req = xr.openCursor(IDBKeyRange.bound("Б", "Б", true, false))  // не срабатывает
 req = xr.openCursor(IDBKeyRange.bound("Б", "В")) // Выводит на букву "Б", а надо [Б-В]
 
 rec.innerHTML= "";
 
 req.onsuccess = function() {
    cursor = req.result;
    if (cursor) {
        let key = cursor.key; // ключ книги (поле id)
        let value = cursor.value; // объект книги
 
        rec.insertAdjacentHTML('beforeend', key+ ". "+ value+ "<br>" );
        cursor.continue();
    }
 }
 
    req.onerror = function () {
        console.log(` onerror !!!`);         
    } 
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2025, 12:36
Ответы с готовыми решениями:

Сохранение больших объемов данных в indexeddb
Мне нужно сохранить в indexeddb 50000 записей. Это можно сделать только вызывая store.add для...

Работа с indexedDB
Доброго времени суток! Никак не могу разобраться с indexedDB. Все примеры, которые я пытался...

indexedDB
Доброго времени суток. Друзья, нужна Ваша помощь. Никак не могу разобраться, почему выдает такую...

16
 Аватар для voraa
1249 / 1159 / 178
Регистрация: 21.01.2024
Сообщений: 5,385
31.10.2025, 13:04
Цитата Сообщение от 755 Посмотреть сообщение
а надо типа
req = xr.openCursor(IDBKeyRange.bound("Б", "Б", true, false)) - но увы данная конструкция почему то не срабатывает
Конечно не сработает. Это означает дать х, которые
"Б" < x && x <= "Б" Вы сами таки придумать сможете?
Только
JavaScript
1
req = xr.openCursor(IDBKeyRange.bound("Б", "В", false, true))
"Б" <= x && x < "В"
1
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
31.10.2025, 13:33  [ТС]
voraa, мне надо задать конструкцию:
"Б" <= x && x <= "Б"

Перепробовал:
req = xr.openCursor(IDBKeyRange.bound("Б", "Б", true, true)
req = xr.openCursor(IDBKeyRange.bound("Б", "Б", false, false))
(естественно для проверки брал больший интервал: Б-Г

Но почему-то ни true ни false не влияют на формирование (включительно/нет) - не могу понять, что ни так понимаю
0
 Аватар для voraa
1249 / 1159 / 178
Регистрация: 21.01.2024
Сообщений: 5,385
31.10.2025, 13:48
Цитата Сообщение от 755 Посмотреть сообщение
Но почему-то ни true ни false не влияют на формирование (включительно/нет) - не могу понять, что ни так понимаю
Тут строки сравниваются.

req = xr.openCursor(IDBKeyRange.bound("Б", "Б", true, true)
"Б" < x && x < "Б" Ну не может быть такой строки х

req = xr.openCursor(IDBKeyRange.bound("Б", "Б", false, false))
"Б" <= x && x <= "Б" Единственная строка, которая подходит - "Б"

Добавлено через 4 минуты
Цитата Сообщение от 755 Посмотреть сообщение
Но почему-то ни true ни false не влияют на формирование (включительно/нет)
req = xr.openCursor(IDBKeyRange.bound("Б", "Г", true, true)
"Б" < x && x < "Г"
Строка "БАБА" подойдет, а строка "Б" - не подойдет. И строка "Г" не подойдет

req = xr.openCursor(IDBKeyRange.bound("Б", "Г", false, false))
"Б" <= x && x <= "Г"
А тут подойдут и строка "Б" и строка "Г"
1
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
31.10.2025, 14:56  [ТС]
Спасибо, voraa, понял, что сравнение идет по строкам.

Но в таком случае возникает вопрос.
Пользователь ввел букву "Б". Можно ли путем поиска, используя ТОЛЬКО букву Б, получить массив всех записей с названием на Б не перебирая весь файл?

Добавлено через 59 минут
Благодарю, voraa, за последний комментарий - после него понял, что решение, похоже, "лежит на поверхности".
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 13:24
Добавлено через 59 минут
Благодарю, voraa, за последний комментарий - после него понял, что решение, похоже, "лежит на поверхности".
755 ,Было бы здорово, если бы вы всё-таки подытожили тему, а то страница лезет в выдачу, а тема толком не закрыта. Тоже мучался с этим IDBKeyRange. В итоге решил курсором проходить по списку от условной «Б» и успокоился на этом.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
30.12.2025, 13:52
Цитата Сообщение от Иван145 Посмотреть сообщение
Тоже мучался с этим IDBKeyRange.
А чего там мучительного?
В букваре все описано...
https://learn.javascript.ru/in... o-klyucham

Диапазоны создаются с помощью следующих вызовов:

- IDBKeyRange.lowerBound(lower, [open]) означает: >lower (или ≥lower, если open это true)
- IDBKeyRange.upperBound(upper, [open]) означает: <upper (или ≤upper, если open это true)
- IDBKeyRange.bound(lower, upper, [lowerOpen], [upperOpen]) означает: между lower и upper, включительно, если соответствующий open равен true.
- IDBKeyRange.only(key) – диапазон, который состоит только из одного ключа key, редко используется.
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 13:57
const lower = 'Б';
const upper = 'Б' + '\uffff'; // максимальный юникод-символ — "закрывает" пространство подстрок с префиксом 'Б'
const range = IDBKeyRange.bound(lower, upper, false, false);

наглядный пример html в zip прикладываю.
Вложения
Тип файла: zip Пример.zip (1.7 Кб, 5 просмотров)
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 14:00
krvsa
А чего там мучительного?
А конкретику можно?
КАК НАЙТИ ВСЕ СЛОВА НА "Б"
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
30.12.2025, 15:09
Цитата Сообщение от Иван145 Посмотреть сообщение
КАК НАЙТИ ВСЕ СЛОВА НА "Б"
Это пока не понятная задача...
Найти записи у которых некое поле начинается на "Б"?
Или в некоем поле есть "слова" начинающиеся на "Б"?

Если некое поле начинается на "Б" - предположу, что это будет так.

JavaScript
1
IDBKeyRange.bound('Б', 'В', true, false)
Поскольку с IndexedDB не работал.
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 15:25
если
Цитата Сообщение от krvsa Посмотреть сообщение
Найти записи у которых некое поле начинается на "Б"?
,то
Цитата Сообщение от Иван145 Посмотреть сообщение
const lower = 'Б';
const upper = 'Б' + '\uffff'; // максимальный юникод-символ — "закрывает" пространство подстрок с префиксом 'Б'
const range = IDBKeyRange.bound(lower, upper, false, false);
наглядный пример html в zip прикладываю.
,а если
Цитата Сообщение от krvsa Посмотреть сообщение
Или в некоем поле есть "слова" начинающиеся на "Б"?
,то только курсором перебирать.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
30.12.2025, 15:41
Иван145, т.е. это не строка из русских букв?

А мой запрос что выберет?

Цитата Сообщение от Иван145 Посмотреть сообщение
то только курсором перебирать
Я так и предполагал...

Добавлено через 7 минут
Иван145, нормально вроде выбирает...

JavaScript
1
2
3
const a = ['А', 'АБ', 'Б', 'БАБА', 'Булка', 'Болт', 'В']
 
a.forEach(v => console.log(v, 'Б' <= v && v < 'В'))
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 15:54
Цитата Сообщение от krvsa Посмотреть сообщение
Иван145, т.е. это не строка из русских букв?
Не имеет значения.

Цитата Сообщение от krvsa Посмотреть сообщение
А мой запрос что выберет?
Ваш запрос вообще выберет "Б_%" и "В".
IDBKeyRange.bound('Б', 'В', true, false)
true значит не равно))
вот тут взял https://developer.mozilla.org/... DBKeyRange
All keys > x && ≤ y IDBKeyRange.bound(x, y, true, false)
All keys ≥ x &&< y IDBKeyRange.bound(x, y, false, true)

и как Вы будете универсальный запрос делать?
считать по Юникоду следующий символ?
тоже можно. upper = String.fromCharCode(lower.charCodeAt(0) + 1)

Цитата Сообщение от krvsa Посмотреть сообщение
А чего там мучительного?
Цитата Сообщение от krvsa Посмотреть сообщение
Поскольку с IndexedDB не работал.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3823 / 1661 / 428
Регистрация: 14.03.2022
Сообщений: 4,168
30.12.2025, 16:08
Цитата Сообщение от Иван145 Посмотреть сообщение
и как Вы будете универсальный запрос делать?
Это уже другой вопрос.
Ты просил конкретику - я тебе ее дал.

Цитата Сообщение от Иван145 Посмотреть сообщение
IDBKeyRange.bound('Б', 'В', true, false)
true значит не равно))
Цитата Сообщение от Учебник Посмотреть сообщение
IDBKeyRange.bound(lower, upper, [lowerOpen], [upperOpen]) означает: между lower и upper, включительно, если соответствующий open равен true.
У меня первый - true. Второй нет
Значит lower <= X, а upper строго > X...

Добавлено через 59 секунд
Цитата Сообщение от Иван145 Посмотреть сообщение
считать по Юникоду следующий символ?
тоже можно. upper = String.fromCharCode(lower.charCodeAt(0) + 1)
Вот видишь!
Ты сам ответил на свой вопрос...

Добавлено через 1 минуту
Иван145, я так и остаюсь при своем мнении - все эти мучения исключительно от незнания или непонимания сути происходящего.
0
0 / 0 / 0
Регистрация: 30.12.2025
Сообщений: 6
30.12.2025, 16:36
Цитата Сообщение от krvsa Посмотреть сообщение
Иван145, я так и остаюсь при своем мнении - все эти мучения исключительно от незнания или непонимания сути происходящего.
Цитата Сообщение от krvsa Посмотреть сообщение
У меня первый - true. Второй нет
Значит lower <= X, а upper строго > X...
Цитата Сообщение от krvsa Посмотреть сообщение
Поскольку с IndexedDB не работал.
Вот если бы Вы попробовали поработать с IndexedDB по этому мануалу с learn.javascript.ru,
то поняли бы меня и не написали:
Цитата Сообщение от krvsa Посмотреть сообщение
А чего там мучительного?
В букваре все описано...
https://learn.javascript.ru/in... o-klyucham
Так как там ошибка.
true → исключает границу
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
30.12.2025, 20:20  [ТС]
Цитата Сообщение от Иван145 Посмотреть сообщение
755 ,Было бы здорово, если бы вы всё-таки подытожили тему
Иван145, извините, только сейчас заглянул на форум и увидел Ваше сообщение.
Сегодня уже наработался - голова тяжелая, чтобы сообразить, как ответить. Если получится, напишу завтра.
1
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
31.12.2025, 09:48  [ТС]
Цитата Сообщение от Иван145 Посмотреть сообщение
755 ,Было бы здорово, если бы вы всё-таки подытожили тему,
Доброе утро, Иван145!
Подумал, строго говоря подытожить тему не смогу, потому что не стал разбираться с true / false на примерах и не уверен, что полностью понял варианты их действий. Поэтому могу только предполагать, что они понятно работают на числовых полях, а для символьных в контексте вопроса темы не оптимально.

На вопрос же темы: почему true / false не подходят для выбора всех записей на букву 'Б' в конструкции
JavaScript
1
xr.openCursor(IDBKeyRange.bound("Б", "Б", true, false))   //  true, false  ИЛИ  false,true
voraa ответ дал: строка проверяется на соответствие не одного символа, а всей ее.

На вопрос же:
Цитата Сообщение от Иван145 Посмотреть сообщение
КАК НАЙТИ ВСЕ СЛОВА НА "Б"
похоже мы с Вами пришли к использованию одинакового решения за небольшим исключением: решил к ключу добавлять "яя", чтобы не пропустить какие-то ненужные символы:
JavaScript
1
req = xr.openCursor(IDBKeyRange.bound([st_fi], [st_fi+"яя"]));
Вариант :
JavaScript
1
2
[quote="Иван145;17691567"]считать по Юникоду следующий символ?
тоже можно. upper = String.fromCharCode(lower.charCodeAt(0) + 1)[/quote]
рассматривал, но решил, что он проигрывает первому.

Добавлено через 24 минуты
И, кстати, могу поделиться еще одним обнаруженным моментом (вроде бы его не встречал в источниках) - похоже при поиске важен тип поля:
• Хранилище формировал путем импорта из массива
• поиск осуществлял по курсору. kl индекса - числовое поле.
• Добавил новую запись через другую функцию. Вроде бы была добавлена, а курсор ее не видел. Обнаружил, что все-таки она была добавлена.
А причиной того, что курсор ее не видел, оказался другой тип ключа - символьный. При том, что kl при импорте записей == 1, а при добавлении == '2' - ни в интервале, ни даже по всему хранилищу не видел.
По-моему память не подводит - когда не нашел в интервале, искал и по всему хранилищу:
JavaScript
1
 req = index.openCursor();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.12.2025, 09:48
Помогаю со студенческими работами здесь

indexedDB get() возвращает пустой объект. А как получить значение по ключу?!
Доброго времени суток, только столкнулся с indexedDB, пробую по всяким (судя по всему второсортным)...

Indexeddb - формирование массива значений из хранилища
Если не затруднит, не подскажите, можно ли решить: Хранилище создаю таким образом: let store =...

Поиск строки в подстроке
Добрый день! Есть строка со спарсенным урлом. На определенной странице сайта есть некоторые опции,...

Замена картинки по подстроке
Подскажите пожалуйста, почему не работает !? Надо по наличию слова в подстроке ставить ту или иную...

Есть ли аналог селектора :contains, который ищет по полному соответствию а не по подстроке?
Как сделать чтобы код выбирал не первый, а второй элемент? Есть ли такой селектор? Мне приходит в...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru