2014-09-12 43 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

相关问题