2009-12-16 25 views
2

我有一個這樣的數組:根據項目屬性值在數組中找到某些項目的最佳方法是什麼?

var anArray = [ 
    { name: "scala", type: "a" }, 
    { name: "abc", type: "b" }, 
    { name: "test", type: "a" }, 
    { name: "ruby", type: "c" }, 
    { name: "erlang", type: "a" }, 
]; 

我想找到根據項目屬性的項目。我目前使用jQuery來做。像這樣的東西;

Array.prototype.find_by_key = function(key, value) { 
    return $.grep(this, function(item){ 
     return (item[key] == value); 
    }); 
} 

var whatIHaveFound = anArray.find_by_key("type", "a"); // find items which the item property: "type" equals "a" 

有沒有更好的方法來做到這一點在JavaScript?還是有一些算法可以更快更好地完成這項工作?當數組有很多項目時。這可能非常緩慢。有任何想法嗎?謝謝。

回答

2

維澤的頭腦可以糾正我,但除非我想你將不得不通過每一次迭代(或多或少類似的速度),:

你知道你要重複搜索而且有些鍵比其他鍵更有可能被搜索到。您可能會偏好收藏,以便收藏不平坦,但會根據您的條款進行預先分類。因此您的收藏將成爲:

var groupedByType = 
{"a":[{name:"scala"},{name:"test"}, {name:"erlang"}], 
{"b":[{name:"abc"}], 
{"c":[{name:"ruby"}]}; 

或者你可以嘗試memoizing您的收藏訪問,比如你做一個搜索後錄製的搜索條件和結果,在這種情況下,在備忘錄中緩存中存儲的

["type","a"]:[ 
{ name: "scala", type: "a" }, 
{ name: "test", type: "a" }, 
{ name: "erlang", type: "a" }] 

優點和缺點:如果底層數據沒有以不贊同緩存的方式進行更改,則訪問先前執行的搜索速度非常快。另一方面,這意味着您必須控制數據訪問(我喜歡在這些情況下將數據存儲在閉包中,這樣我只需要展示增變器 - 一種輕量級OO但具有更多保護),而您可能會發現,在修改緩存數據時,可能會發現它比放棄緩存數據更有效,這取決於數據的結構。

但是我會強調一切儘管,絕對確保您需要任何優化。這一部分是否足夠快?你能否以另一種方式加速你的應用程序?如果你正在編寫一個客戶端搜索引擎或者其他的東西,你可能會想進一步深入一下,而不僅僅是確定哪個jQuery迭代器是最快的。

+0

非常感謝你。非常全面的謝謝你。 – www 2009-12-17 02:11:14

1

您可以使用此JavaScript庫DefiantJS(http://defiantjs.com),您可以使用它在JSON結構上使用XPath篩選匹配項。把它放在JS代碼:

var anArray = [ 
    { name: "scala", type: "a" }, 
    { name: "abc", type: "b" }, 
    { name: "test", type: "a" }, 
    { name: "ruby", type: "c" }, 
    { name: "erlang", type: "a" }, 
];. 
res = JSON.search(anArray, '//*[type="a"]'); 

console.log(res[0].name); 
// scala 

console.log(res.length); 
// 3 

這裏是工作提琴:
http://jsfiddle.net/hbi99/wM98Y/4/

DefiantJS與「搜索」的方法擴展了全球的對象,並返回如果沒有匹配與匹配的數組(空數組被發現)。你可以在這裏使用XPath計算器試用lib和XPath查詢:

http://www.defiantjs.com/#xpath_evaluator

相關問題