开发者问题收集

搜索 JavaScript 对象

2009-11-30
27752

我有一个这样的 JavaScript 对象:

[{
    name : "soccer",
    elems : [
        {name : "FC Barcelona"},
        {name : "Liverpool FC"}
    ]
},
{
    name : "basketball",
    elems : [
        {name : "Dallas Mavericks"}
    ]
}]

现在我想在浏览器中搜索这个 JavaScript 对象。搜索“FC”应该会给我这样的结果:

[
    {name : "FC Barcelona"},
    {name : "Liverpool FC"}
]

如何快速完成?有没有 JavaScript 库可以实现这个功能?

3个回答

您可能喜欢使用 jLinq(个人项目)

http://hugoware.net:4000/Projects/jLinq

与 LINQ 类似,但针对 JSON,允许您根据需要对其进行扩展和修改。已经有许多预构建的方法来检查值和范围。

hugoware
2009-11-30

看起来好像唯一有用的答案是引用第三方库 - 这是您的原生 javascript 解决方案。对于只想要几行代码而不是堆栈的人:

函数:

Array.prototype.findValue = function(name, value){
   var array = map(this, function(v,i){
        var haystack = v[name];
        var needle = new RegExp(value);
        // check for string in haystack
        // return the matched item if true, or null otherwise
      return needle.test(haystack) ? v : null;
   });
  return array;
}

原生 .map() 函数:

map = function(array, mapFunction) {
      var newArray = new Array(array.length);
      for(var i = 0; i < array.length; i++) {
        newArray[i] = mapFunction(array[i]);
      }
      return newArray;
}

您的对象:

(从您发布的对象中略读):

myObject = {
        name : "soccer",
        elems : [
            {name : "FC Barcelona"},
            {name : "Liverpool FC"}
        ]
    },
    {
        name : "basketball",
        elems : [
            {name : "Dallas Mavericks"}
        ]
    }

用法:

(这将在您的 myObject.elems 数组中搜索与“FC”匹配的“名称”)

var matched = myObject.elems.findValue('name', 'FC');
console.log(matched);

结果 - 检查您的控制台:

[Object, Object, findValue: function]
0: Object
name: "FC Barcelona"
__proto__: Object
1: Object
name: "Liverpool FC"
__proto__: Object
length: 2
__proto__: Array[0]
J Charles
2014-06-09

尝试 jOrder。 http://github.com/danstocker/jorder

它针对 JS 中大型(数千行)表的快速 O(logn) 搜索和排序进行了优化。

与数组迭代(此处大多数答案都基于此)相反,jOrder 使用索引来过滤数据。仅供参考,对 1000 行表进行自由文本搜索比迭代快 100 倍左右。表越大,获得的比率越好。

但是 jOrder 无法处理您的示例数据的格式。但是,如果您像这样重新格式化它:

var teams =
[
{ sport : "soccer", team: "FC Barcelona" },
{ sport : "soccer", team: "Liverpool FC" },
{ sport : "basketball", team : "Dallas Mavericks"}
]

您可以通过首先设置 jOrder 表来获得所需的结果:

var table = jOrder(teams)
    .index('teams', ['team'], { grouped: true, ordered: true, type: jOrder.text });

然后对其进行搜索:

var hits = table.where([{ team: 'FC' }], { mode: jOrder.startof });

您将获得所需的两行。就是这样。

Dan Stocker
2010-07-16