Имеется вот такой вот 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;
}