【问题标题】: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

标签: javascript jquery arrays string


【解决方案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。 (我提出的修改可能会或可能不会获得批准)
猜你喜欢
  • 2020-08-22
  • 2011-03-18
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2020-10-25
  • 2019-01-31
相关资源
最近更新 更多