Javascript 列出包含给定字符串的键?

Javascript 列出包含给定字符串的键?,javascript,jquery,arrays,string,Javascript,Jquery,Arrays,String,给定数据如: 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 },

给定数据如:

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
中的所有对象的列表?


注意:我目前使用
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

无论如何它都能工作,但我不知道它是有效的还是完全转储。

您可以使用
filter()


您还可以签出

您可以编写一个基本函数,用于根据键和值返回匹配数组:

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

var result = find(people, 'myKey', 'Kenedy');
或者,对…循环使用正常的

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;
}
函数查找(arr、key、val){
var out=[];
对于(变量i=0,l=arr.length;i-1){
向外推(arr[i]);
}
}
返回;
}

为了搜索未排序的对象,您需要遍历它的所有属性-因此,我想说一个带有
索引的
的简单循环将是您能做的最好的选择:

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

也许你可以稍微调整一下,但这几乎是你能得到的最好的了。

这不是JSON。这是一个对象文本的javascript数组。只是附带说明一下:如果你想使用lib,linq.js非常好而且很快!这个问题似乎与主题无关,因为它更适合于说明OP不仅在搜索,而且还在匹配项中添加属性。另外,使用
filter
更简洁,但它不能比
o(n)
过滤更好,因为我也可以先列出我的目标,然后应用一些更改。你应该使用一个更合适的循环,因为它是数组,而不是对象。请在for循环中将
people
替换为
arr
。(我提议的编辑可能会获得批准,也可能不会获得批准)
var foundItems = [];
for(var i = 0; i < people.length ;i++)
{
    if(people[i].myKey.indexOf('Kenedy') > -1)
       foundItems.push(people[i]]);       
}