【问题标题】:what is the best way to find some items in an array based on the item property value?根据项目属性值在数组中查找某些项目的最佳方法是什么?
【发布时间】:2010-12-27 04:28:55
【问题描述】:

我有一个这样的数组:

var anArray = [
    { name: "scala",  type: "a" },
    { name: "abc",    type: "b" },
    { name: "test",   type: "a" },
    { name: "ruby",   type: "c" },
    { name: "erlang", type: "a" },
];

我想根据 item 属性查找项目。我目前使用 jQuery 来做这件事。像这样的东西;

Array.prototype.find_by_key = function(key, value) {
    return $.grep(this, function(item){
        return (item[key] == value);
    });
}

var whatIHaveFound = anArray.find_by_key("type", "a"); // find items which the item property: "type" equals "a"

有没有更好的方法在 javascript 中做到这一点?还是有一些算法可以更好更快地做到这一点?当数组有很多项时。这可能很慢。有任何想法吗?谢谢。

【问题讨论】:

    标签: javascript json search


    【解决方案1】:

    聪明的人可能会纠正我,但我认为您每次都必须迭代(以或多或少相似的速度),除非:

    您知道您将重复搜索,并且某些键比其他键更有可能被搜索。然后您可能会偏向集合,使其不是平坦的,而是根据您的条款进行预分类。因此,您的收藏将变为:

    var groupedByType = 
    {"a":[{name:"scala"},{name:"test"}, {name:"erlang"}],  
    {"b":[{name:"abc"}],  
    {"c":[{name:"ruby"}]};  
    

    或者,您可以尝试记忆您的收藏访问权限,以便在完成搜索后记录搜索词和结果,在这种情况下将其存储在备忘录缓存中

    ["type","a"]:[
    { name: "scala",  type: "a" },  
    { name: "test",   type: "a" },  
    { name: "erlang", type: "a" }]
    

    这样的优点和缺点:如果基础数据没有以不推荐使用缓存的方式更改,则访问以前执行的搜索非常快。另一方面,这意味着您必须控制数据访问(在这些情况下,我喜欢将我的数据存储在闭包中,这样我只需要公开变异器 - 有点像轻量级的 OO,但具有更多保护),并且您可能会发现在修改缓存数据时丢弃它比尝试计算增量更高效,具体取决于数据的结构。

    不过,我最要强调的是,绝对确保您需要任何优化。这个小节够快吗?你能以另一种方式让你的应用程序加速吗?如果您正在编写客户端搜索引擎或其他东西,您可能会想要更深入地研究它,而不仅仅是找出哪个 jQuery 迭代器最快。

    【讨论】:

      【解决方案2】:

      您可以使用这个 javascript 库 DefiantJS (http://defiantjs.com),您可以使用它在 JSON 结构上使用 XPath 过滤匹配项。放到JS代码里:

      var anArray = [
          { name: "scala",  type: "a" },
          { name: "abc",    type: "b" },
          { name: "test",   type: "a" },
          { name: "ruby",   type: "c" },
          { name: "erlang", type: "a" },
      ];.
      res = JSON.search( anArray, '//*[type="a"]' );
      
      console.log( res[0].name );
      // scala
      
      console.log( res.length );
      // 3
      

      这是一个有效的小提琴:
      http://jsfiddle.net/hbi99/wM98Y/4/

      DefiantJS 使用“search”方法扩展全局对象并返回一个匹配的数组(如果没有找到匹配则为空数组)。您可以在此处使用 XPath Evaluator 试用 lib 和 XPath 查询:

      http://www.defiantjs.com/#xpath_evaluator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 2020-12-15
        • 2018-10-11
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多