2014-04-20 162 views
1

,我有以下數據高級AngularJS Live搜索

persons = [ 
{ 
    "age":20, 
    "parameter1":94, 
    "name":"Foobarin" 
}, 
{ 
    "age":33, 
    "parameter1":49, 
    "name":"Johan" 
} 
] 

我想創建可識別的圖案先進的生活搜索。一個例子可能是「foo a20 p94」,這會讓我成爲第一個對象。 a20 - 搜索哪裏年齡是20 p94 - 搜索參數1的位置是94 ,然後如果有任何其他文本沒有任何設置前綴,則根據名稱值進行測試。

所有值(大小寫不敏感的名稱除外)都是整型。我想限制前綴預定義,如a,p而不是age20。 數據集大約爲400.

我創建了一個基本的實時搜索,它搜索對象中的所有變量,但現在我不知道該繼續。有任何想法嗎?

+0

所以......有什麼問題呢? – Emissary

+0

我真的不知道從哪裏開始!我設法創建了一個非常基本的實時搜索,只搜索對象中的所有變量。 –

+0

你會一直想要匹配一個字母還是應該接受'ag20'?你正在搜索的所有參數(名稱除外)是否具有整數值?搜索應該不區分大小寫?實際上潛在的數據集有多大? ***即,你應該首先考慮索引數據...你需要首先明確定義邊界,否則問題太模糊了。 – Emissary

回答

1

這不是萬無一失的,但作爲第一遍,這是我開始的,我會嘗試通過它僞造。

首先聲明一個propertyMatrix,這是一個簡單的對象圖,可以將「前綴」指向person中存在的實際屬性名稱。的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

+0

雖然 –

+0

@Dan它不是 - 它只是一個簡單的骨骼javascript,沒有理由不能將它合併到一個角度模塊中。可能有更好的方法(***即***過濾器),但這裏有一個簡單的例子:http://jsfiddle.net/QT9dm/1/ – Emissary