【问题标题】:jQuery Grep Alternatives to Return One Item返回一项的 jQuery Grep 替代方案
【发布时间】:2013-08-03 19:12:36
【问题描述】:

我正在查看我目前正在编写的一些 jQuery 代码,它在我的 C# 大脑中看起来很奇怪。有更好的方法吗?

var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.grep(myArray , function (elm) {
    return elm.id == idToLookFor;
});

var itemFound = arrayItem[0];

我可以理解 grep 返回一个数组而不是一个查找类型函数,它是一个过滤类型函数,所以我想问题应该是真的有一个函数只会返回一个项目而不是一个数组吗?

【问题讨论】:

  • 是的,你已经在最后一行使用了。
  • 如果你只需要数组中的第一个匹配项,只需loop over the array 直到你得到它?
  • 我认为这可能只是 [in the question] 的一个错字,但上述内容不起作用,myArray 不包含任何具有名为 Id 的属性的对象
  • 是的,这是一个错字:)
  • @Jammer,您可以只返回 grep? 中的元素?像这样var arrayItem = $.grep(myArray , function (elm) { if(elm.id == idToLookFor) return elm; });。如果它不匹配任何东西,它将返回一个空数组

标签: javascript jquery


【解决方案1】:

check my answer here

复制自 Array.find 的 polyfill Array.prototype.find 代码,并将数组添加为第一个参数。

您可以将搜索词作为谓词函数传递

【讨论】:

    【解决方案2】:

    请使用

    var idToLookFor = 2;
    var myArray = [{id:1},{id:2},{id:3}]
    
    var arrayItem = $.map(myArray , function (elm) {
        if(elm.id == idToLookFor)
          return elm.id ;
    });
    
    var itemFound = arrayItem[0];
    

    【讨论】:

      【解决方案3】:

      扩展 Blazemonger 的评论:

      var itemFound = myArray[idToLookFor - 1]
      

      如果我正确理解您的问题,应该会为您提供您正在寻找的物品。注意 -1 以说明从 1 开始的索引

      编辑:这还假设数组将始终按 ID 升序排序,就像您的问题一样。如果您的 id 确实增加得很好,但数组最初没有按它们排序,请参阅:Sort array of objects by string property value in JavaScript

      【讨论】:

      • 如果项目确实已排序,这是一个很好的解决方案。
      • 我不认为数组项的“id”属性与数组中的索引有任何关系。 Blazemonger 的意思是要获取数组中的第一个元素,只需使用[0],仅此而已。
      • 啊,我明白了,我只是认为 id 从 1 开始并递增 1,而不仅仅是一个任意数字。如果是这种情况,那么在使用我的解决方案之前,可以按 id 值对数组进行排序。 stackoverflow.com/questions/1129216/…
      【解决方案4】:

      好吧,如果你喜欢使用 jQuery 泛型函数样式,你可以在你的个人库中添加这样的东西:

      $.extend( {
          findFirst: function( elems, validateCb ){
              var i;
              for( i=0 ; i < elems.length ; ++i ) {
                  if( validateCb( elems[i], i ) )
                      return elems[i];
              }
              return undefined;
          }
      } );
      

      你的例子的用法:

      var result = $.findFirst( myArray, function(elm) {
          return elm.id == idToLookFor;
      });
      

      当然,您也可以使用自己的命名空间...

      我认为您关心的是代码可读性。我认为直接使用语言循环解决这个问题也很好。

      您也可能担心 浪费,因为没有必要为此维护另一个数组结构,但至少对于您的示例而言,这似乎是一个 微优化 问题。

      【讨论】:

        【解决方案5】:

        这个对另一个问题的回答指出 grep 将继续循环遍历数组,即使它找到了正确的答案。在上面的示例中不是问题,但如果您的数组可能更大,则值得注意:non grep solution

        这只是一个包装在一个函数中的 for 循环,该函数返回它找到的对象。即使您坚持使用 grep 方法,我仍然会将您的逻辑抽象为一些可重用的函数,并将其保存在某个不错的帮助文件中。

        我只是发布答案的修改版本,以便您在决定是否要点击链接之前先了解我的意思:

        for (var i = 0, len = myArray.length; i < len; i++) 
        {
            if (myArray[i].id === idToLookFor)
            {
                return myArray[i]; // Return as soon as the object is found
            }
        }
        

        【讨论】:

          【解决方案6】:

          如果您有一个对象数组,则可以这样做:

          var result = myArray.filter(function(v) {
              return v.id === idToLookFor; 
          })[0];
          

          对于一个简单的数组,您可以使用 inArray 。它返回该项目所在的数组的键!。

          var itemFound= myArray[$.inArray(idToLookFor,myArray)];

          【讨论】:

          • 这仅适用于值数组。问题中的数组是对象数组。
          • 如果只需要第一次出现,为什么要过滤整个数组? for-loop 更快更好
          猜你喜欢
          • 2014-09-20
          • 2012-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-18
          • 1970-01-01
          • 1970-01-01
          • 2011-07-11
          相关资源
          最近更新 更多