【问题标题】:jQuery: Index of element in array where predicatejQuery:数组中元素的索引,其中谓词
【发布时间】:2010-07-13 21:57:41
【问题描述】:

我有一个对象数组。除其他外,每个对象都有一个 ID 属性。我想在具有特定 ID 的对象的数组中找到索引。在 jQuery 中是否有任何优雅而简单的方法可以做到这一点?

【问题讨论】:

  • 正是我也在寻找的。太糟糕了,确实没有优雅的解决方案......

标签: javascript jquery arrays


【解决方案1】:
请参阅 [`Array.filter`][1] 以使用回调函数过滤数组。数组中的每个对象都会一一传递给回调函数。如果要包含该值,则回调函数必须返回 `true`,否则返回 false。 var matchingIDs = objects.filter(function(o) { 返回 o.ID == searchTerm; }); ID 为 searchTerm 的所有对象都将作为数组返回到匹配 ID。从第一个索引中获取匹配元素(假设 ID 是唯一的并且只有一个) 匹配IDs[0]; [1]:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter

更新:

从 ECMAScript 6 签出 findIndex

items.findIndex(function(item) { item.property == valueToSearch; });

由于findIndex 在大多数浏览器上尚不可用,您可以使用此implementation 回填它:

if (!Array.prototype.findIndex) {
  Array.prototype.findIndex = function(predicate) {
    if (this == null) {
      throw new TypeError('Array.prototype.findIndex called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return i;
      }
    }
    return -1;
  };
}

【讨论】:

  • OP 询问如何获取元素的索引而不是元素本身。
  • @epeleg - 我似乎没有正确阅读这个问题。正如 Oleg 建议的那样,循环遍历每个对象并在找到匹配项时中断。
【解决方案2】:

如果您应该在 javascript 中使用 for 循环而不是使用 jQuery。见http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance/中的方式3

更新: jQuery 是用 javascript 编写的,它不能比同样用 javascript 编写的其他代码快。如果您使用 DOM,jQuery 非常好,但如果您使用简单的 javascript 数组或对象,则它并没有真正的帮助。

您要查找的代码可能是这样的:

for (var i=0, l = ar.length; i<l; i++) {
    if (ar[i].ID === specificID) {
        // i is the index. You can use it here directly or make a break
        // and use i after the loop (variables in javascript declared
        // in a block can be used anywhere in the same function)
        break;
    }
}
if (i<l) {
    // i is the index
}

重要的是您应该遵守一些简单的 javascript 规则:始终声明局部变量(不要忘记在变量声明之前var)并将您多次使用的任何属性或索引缓存在局部变量中(例如 @987654326 @ 更多)。 (例如参见http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices

【讨论】:

    【解决方案3】:

    不是很优雅,而是一个可爱的把戏:

    var index = parseInt(
      $.map(array, function(i, o) { return o.id === target ? i : ''; }).join('')
    );
    

    jQuery 没有很多这样的函数式结构。该库的理念是真正专注于 DOM 争吵的工作。他们甚至不会添加 .reduce() 函数,因为没人能想到它对核心功能有用的原因。

    Underscore.js 库有很多这样的工具,而且它与 jQuery “配合得很好”。

    【讨论】:

    • 很好,但是因为它遍历数组中的所有元素而效率低下...如果您遍历它们,您不妨构建一个反向哈希,这样您就可以回答许多“特定 ID”的 Q s.
    【解决方案4】:

    没有用于此的内置方法; [].indexOf() 方法不使用谓词,因此您需要一些自定义:

    function indexOf(array, predicate)
    {
        for (var i = 0, n = array.length; i != n; ++i) {
            if (predicate(array[i])) {
                return i;
            }
        }
        return -1;
    }
    
    var index = indexOf(arr, function(item) {
        return item.ID == 'foo';
    });
    

    如果谓词从未产生真值,则函数返回 -1。

    更新

    您现在可以使用Array.findIndex()

    const arr = [{ID: 'bar'}, {ID: 'baz'}, {ID: 'foo'}];
    const index = arr.findIndex(item => item.ID === 'foo');
    console.log(index); // 2

    【讨论】:

      【解决方案5】:

      使用 jOrder。 http://github.com/danstocker/jorder

      将您的数组输入到 jOrder 表中,并在“ID”字段上添加索引。

      var table = jOrder(data)
          .index('id', ['ID']);
      

      然后,通过以下方式获取元素的数组索引:

      var arrayidx = table.index('id').lookup([{ ID: MyID }]);
      

      如果你想要整行,那么:

      var filtered = table.where([{ ID: MyID }]);
      

      瞧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多