【问题标题】:Should I use jQuery.inArray()?我应该使用 jQuery.inArray() 吗?
【发布时间】:2010-12-25 09:58:09
【问题描述】:

我经常在对象数组中进行搜索,并且一直在使用 jQuery.inArray()。但是,我遇到了速度和内存问题,根据我的分析器,最常调用的方法之一是 jQuery.inArray()。街上对它的表现有什么看法?我应该切换到简单的 for 循环吗?

我的具体功能是:

function findPoint(point, list)
{
  var l = list.map(function anonMapToId(p) { return p.id });
  var found = jQuery.inArray(point.id, l);
  return found;
}

也许list.map() 更应该受到责备?

【问题讨论】:

  • 请问您如何确定这是一个性能问题? (只是出于好奇)
  • 说实话,我不记得了。
  • 公平地说,我没有注意到这个问题已经超过一年了......好吧,你还记得根据“我的分析器”是什么意思吗?你用的是什么分析器?
  • 我可能正在使用 Firebug...

标签: javascript jquery arrays map


【解决方案1】:

在内部inArray 做了一个简单的循环,我建议您检查是否有原生的Array.prototype.indexOf 实现并使用它而不是inArray(如果有):

function findPoint(point, list) {
  var l = list.map(function anonMapToId(p) { return p.id });
  var found = ('indexOf' in Array.prototype) ? l.indexOf(point.id)
                                             : jQuery.inArray(point.id, l);
  return found;
}

Array.prototype.indexOf 方法已在实现 JavaScript 1.6 的浏览器中引入,它将成为 ECMAScript 5 标准的一部分。

原生实现比非原生实现快方式

【讨论】:

  • jQuery 已经自动完成了这项工作。 forum.jquery.com/topic/inarray(在帖子的第一条评论中)顺便说一句,IE8 没有实现 Array.prototype.indexOf。
  • 'inArray' 听起来更像是返回一个布尔值,但事实并非如此。帮下一个开发者一个忙,使用“indexOf”。
  • 我认为如果你不缓存 indexOf 方法的存在的测试结果,它会破坏“速度”的目的。我也相信 jQuery 会为你做到这一点...
【解决方案2】:

你真正想要的是Array.prototype.filter

function findPoint(point, list)
{
     return list.filter(function anonFilterToId(p) { 
         return p.id === point.id; 
     }).length > 0;
}

【讨论】:

    【解决方案3】:

    即使inArray 函数很慢,您仍然要为每次搜索创建一个全新的数组。我想重新设计这个搜索会更好,例如找到点之前创建 id-list,并使用该点进行搜索:

    【讨论】:

      【解决方案4】:

      我正在对数组进行连接以将其转换为字符串并避免像这样的循环部分:

      var strList = ","+array.join(",")+",";
      return strList.indexOf(","+search+",") !== -1 ? true : false;
      

      如果数组很大,它可能会受到伤害,但对于一个小列表,它比循环解决方案快得多

      PS 我正在添加一个结尾昏迷以避免看起来像

      【讨论】:

      • 这可能不是最漂亮的方法,但它消除了我在 IE8 中使用 inArray 时遇到的“停止运行此脚本”错误。
      【解决方案5】:

      当我想知道我的数组中是否有字符串时,我总是使用lastIndexOf。 所以,它是这样的:

      var str = 'a';
      var arr = ['a','b','c'];
      
      if( arr.lastIndexOf(str) > -1){ 
      
            alert("String " + str + " was found in array set");
      
      } else {
      
            alert("String " + str + " was not found");
      
      }
      

      如果您只想在数组中查找字符串,我相信这可能是最佳做法。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 2021-12-10
        • 2014-05-27
        • 2010-12-25
        • 2018-09-11
        • 2012-07-02
        • 2017-04-21
        • 2010-10-29
        • 2020-08-31
        相关资源
        最近更新 更多