我有以下数据
persons = [
{
"age":20,
"parameter1":94,
"name":"Foobarin"
},
{
"age":33,
"parameter1":49,
"name":"Johan"
}
]
我想创建一个识别模式的高级实时搜索。一个例子可能是" foo a20 p94"这会让我成为第一个对象。 a20 - 年龄为20岁的搜索 p94 - 搜索parameter1为94的位置 然后,如果有任何其他文本没有任何设置前缀,则根据名称值对其进行测试。
所有值(不区分大小写的名称除外)都是整数类型。我想将前缀限制为预定义,例如a,p而不是age20。 数据集大约为400。
我创建了一个基本的实时搜索,搜索对象中的所有变量,但现在我不知道从哪里继续。有什么想法吗?
答案 0 :(得分:1)
这不是万无一失的,但作为第一遍这是我的开始,我会尝试用伪说话来讨论它。
首先声明一个propertyMatrix
,一个简单的对象图,它可以将“前缀”指向人体内存在的实际属性名称。 searchPersons
函数接受单个字符串(查询)值,由两个主要部分组成:
查询字符串在空格字符上拆分为“标记”数组。每个标记也是一个正好为2个长度的数组,包含每个标记名称和标记值。在此阶段,它会尝试找到预定的前缀 - 如果不存在此类条目,则会假定令牌名称为:name
。
然后将过滤器应用于persons
数组。对于每个人,我们迭代tokens
数组并进行适当的比较,如果任何单一检查失败,我们返回false(从而将人排除在结果之外)。
var propertyMatrix = {
'a': 'age',
'p': 'parameter1'
},
searchPersons = function(query){
var tokens = query.split(/\s+/).map(function(t){
t = t.toLowerCase();
var i = t.match(/\d+$/), p;
if(i && i.length) {
p = t.substring(0, t.indexOf(i));
if(p in propertyMatrix)
return [propertyMatrix[p], parseInt(i, 10)];
}
return ['name', t];
}),
result = persons.filter(function(p){
for(var i=0, l=tokens.length; i<l; i++){
var token = tokens[i][0], value = tokens[i][1];
if(!(token in p)) return false;
if(token === 'name'){
if(p.name.toLowerCase().indexOf(value)<0) return false;
} else if(p[token] !== value) return false;
}
return true;
});
return result;
};