高级AngularJS实时搜索

时间:2014-04-20 10:20:58

标签: javascript angularjs web

我有以下数据

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。

我创建了一个基本的实时搜索,搜索对象中的所有变量,但现在我不知道从哪里继续。有什么想法吗?

1 个答案:

答案 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;

};

fiddle