2014-09-12 33 views
3

鑑於數據如:列出包含給定字符串的鍵?

var people = [ 
    { 'myKey': 'John Kenedy', 'status': 1 }, 
    { 'myKey': 'Steeven Red', 'status': 0 }, 
    { 'myKey': 'Mary_Kenedy', 'status': 3 }, 
    { 'myKey': 'Carl Orange', 'status': 0 }, 
    { 'myKey': 'Lady Purple', 'status': 0 }, 
    ...          // thousands more 
]; 

如何有效地獲取包含在myKey字符串Kenedy所有對象的列表?

http://jsfiddle.net/yb3rdhm8/


注:我目前使用str.search()

搜索( 「STR」)返回匹配的位置。如果找不到匹配,則返回-1。

做如下:

var map_partial_matches = function(object, str){ 
    var list_of_people_with_kenedy = [] ; 
    for (var j in object) { 
     if (object[j]["myKey"].search(str) != -1) { 
      object[j].presidentName = "yes"; // do something to object[j] 
      list_of_people_with_kenedy.push({ "people": object[j]["myKey"] }); // add object key to new list 
     } 
    } return list_of_people_with_kenedy; 
} 
map_partial_matches(people, "Kenedy"); 

我能做到使用str.match()相同:

str.match()返回比賽,作爲一個數組對象。如果找不到匹配,則返回null

它可以工作,但我不知道它是否有效或完全轉儲。

+0

這不是JSON。這是一個對象文字的JavaScript數組。 – 2014-09-12 16:22:41

+1

只是一個方面說明:如果你想使用一個庫,linq.js是非常好,快! http://linqjs.codeplex.com/ – 2014-09-12 16:22:46

+1

這個問題似乎是脫離主題,因爲它更適合http://codereview.stackexchange.com/ – 2014-09-12 16:24:26

回答

1

您可以編寫使用filter返回基於鍵和值匹配數組的基本功能:

function find(arr, key, val) { 
    return arr.filter(function (el) { 
    return el[key].indexOf(val) > -1; 
    }); 
} 

var result = find(people, 'myKey', 'Kenedy'); 

或者使用正常for...loop

function find(arr, key, val) { 
    var out = []; 
    for (var i = 0, l = arr.length; i < l; i++) { 
    if (arr[i][key].indexOf(val) > -1) { 
     out.push(arr[i]); 
    } 
    } 
    return out; 
} 

DEMO

+0

請在for循環中用'arr'替換'people'。 (我提出的編輯可能會或可能不會得到批准) – Hugolpz 2014-09-12 21:27:14

+0

@Hugolpz,謝謝。我沒有注意到這一點。 – Andy 2014-09-12 23:17:55

2

您可以使用filter()

var filtered = people.filter(function (item) { 

    if (item.myKey.indexOf("Kenedy") != -1) 
     return item; 

}); 

您還可以檢出Sugar.js

+0

請注意,OP不僅僅是搜索,還添加了一個財產到匹配項目。此外,使用'過濾器'更簡潔,但它不能比'o(n)更好' – 2014-09-12 16:27:42

+0

感謝您的瞭解 – 2014-09-12 16:28:45

+0

過濾仍然很有趣,因爲我也可能首先列出我的目標,然後應用一些更改。 – Hugolpz 2014-09-12 16:30:21

2

爲了尋找你需要通過這一切,讓您的無序對象的屬性 - 所以我說有indexOf一個簡單的循環將是非常最好的,你可以去:

var foundItems = []; 
for(var i = 0; i < people.length ;i++) 
{ 
    if(people[i].myKey.indexOf('Kenedy') > -1) 
     foundItems.push(people[i]]);  
} 

也許你可以調整它一點點,但它幾乎是最好的,你可以得到。

+0

你應該真的使用更合適的循環,因爲它是一個數組,而不是一個對象。 – Andy 2014-09-12 16:42:26

+0

你沒事..當時意識到這是一個數組..編輯... – 2014-09-12 17:22:13