Поиск по json
Имеется вот такой вот js, в котором много много групп, условно именуемых цифрами. (например от 10 до 10000).
в каждой есть подгруппа, ещё подгруппа и т.д. '110' : { 'name' : 'первый', 'id' : '110', 'image' : 'флешка.swf', 'columns' : '2', 'rows' : '5', 'op5' : { 'name' : '1.1', 'id' : '21271', 'image' : 'картинка.gif', 'visible' : '1' }, 'op6' : { 'name' : '1,2', 'id' : '20952', 'image' : 'картинка.gif', 'visible' : '1' } }, '10000' : { 'name' : 'два', 'id' : '10000', 'image' : 'гиф.gif', 'columns' : '2', 'rows' : '5', '101' : { 'name' : '2,1', 'id' : '101', 'image' : 'гиф.gif', 'titleimage' : 'гиф.gif', 'columns' : '4', 'rows' : '5', 'op6' : { 'name' : '2,3', 'id' : '20005', 'image' : 'гиф.gif', 'visible' : '1', 'conent_images' : 'logo_2.gif,logo_3.gif,logo_4.gif,logo_flyer.gif' пользователь вводит в поле что-то и поиск, который ищет по этому json, выводит совпадения. все чудно работает, за одним исключением. есть группа (в примере пускай будет 10000, последняя тоесть). она для внутренних нужд всяких, в ней по сути дублируются все предыдущие группы. так вот по ней искать не надо. а то получается если из какой-то группы удалить пункт, а из этой последней нет, то поиск выдает результат все-равно. помогите пожалуйста, как исключить её? function createSearchIndex(groupID) { var result = {}; if(groupID) result = reqursiveSearch($menu[0][groupID], groupID); else { for(var k in $menu[0]) result = concatObjects(result, reqursiveSearch($menu[0][k], k)); } return result; } function reqursiveSearch(obj, parentKey) { var result = {}; for(var i in obj) if(typeof obj[i] == 'object' && i != 'parent') result = concatObjects(result, reqursiveSearch(obj[i], i)); else if(i == 'id' && parentKey.indexOf('op') != -1) result[obj[i]] = obj; return result; } function concatObjects() { var l = arguments.length; if(l < 2) return false; var i, k, result = arguments[0]; for(i = 1; i < l; i++) { if(typeof arguments[i] == 'object') for(k in arguments[i]) result[k] = arguments[i][k]; } return result; } а, ну и сам поиск function search() { if(__cache[query]) return __cache[query]; var result = {}; var qString = query.replace(/[\s]{2,}/gim, ' '); qString = qString.replace(/^[\s]+|[\s]+$/g, ''); qString = getKeywords(qString); qString = qString.replace(/[\s]+/g, '(?:\\s+|-)'); /** * Поиск по двум регулярным выражениям. Первая для русского, вторая для транслита */ var cacheObj = getCacheObj(); for(var k in cacheObj) { if(new RegExp('((?:\\s+|^|-)' + qString + '[^\\s]*)', 'mgi').test(searchIndex[k]['name']) || new RegExp('((?:\\s+|^|-)' + trans(qString) + '[^\\s]*)', 'mgi').test(searchIndex[k]['name'])) result[k] = cacheObj[k]; } if(query.length > 0) __cache[query] = result; purgeCache(); return result; } |
Часовой пояс GMT +3, время: 15:57. |