列出包含给定字符串的键?
Posted
技术标签:
【中文标题】列出包含给定字符串的键?【英文标题】:Listing keys containing a given string? 【发布时间】:2014-11-06 21:23:19 【问题描述】:给定数据,例如:
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()
:
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
。
无论如何它都有效,但我不知道它是否有效或完全转储。
【问题讨论】:
那不是 JSON。这是一个对象字面量的 javascript 数组。 附注:如果你想使用 lib,linq.js 非常好而且速度很快! linqjs.codeplex.com 这个问题似乎离题了,因为它更适合codereview.stackexchange.com 【参考方案1】:你可以使用filter()
:
var filtered = people.filter(function (item)
if (item.myKey.indexOf("Kenedy") != -1)
return item;
);
您也可以结帐Sugar.js
【讨论】:
请注意,OP 不只是搜索,还为匹配项添加属性。此外,使用filter
更简洁,但它不能比o(n)
做得更好
过滤仍然很有趣,因为我也可以先列出我的目标,然后应用一些更改。【参考方案2】:
为了搜索您未排序的对象,您需要了解它的所有属性 - 所以我想说一个带有 indexOf
的简单循环几乎是您可以去的最好的:
var foundItems = [];
for(var i = 0; i < people.length ;i++)
if(people[i].myKey.indexOf('Kenedy') > -1)
foundItems.push(people[i]]);
也许你可以稍微调整一下,但这几乎是你能得到的最好的。
【讨论】:
你真的应该使用更合适的循环,因为它是一个数组,而不是一个对象。【参考方案3】:您可以编写一个基本函数,使用 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
【讨论】:
请在 for 循环中将people
替换为 arr
。 (我提出的修改可能会或可能不会获得批准)以上是关于列出包含给定字符串的键?的主要内容,如果未能解决你的问题,请参考以下文章