问题 jQuery:数组中元素索引的谓词


我有一个对象数组。每个对象都具有ID属性。我想在具有特定ID的对象数组中找到索引。在jQuery中有没有优雅而简单的方法呢?


2738
2017-07-13 21:57


起源

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


答案:


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

更新: 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 在变量声明之前)并缓存在局部变量中多次使用的任何属性或索引(如 ar.length 以上)。 (例如,参见 http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices


4
2017-07-13 22:05





请参见[`Array.filter`] [1]以使用回调函数过滤数组。数组中的每个对象将逐个传递给回调函数。如果要包含该值,则回调函数必须返回“true”,否则返回false。

    var matchingIDs = objects.filter(function(o){
        return o.ID == searchTerm;
    });

具有ID为searchTerm的所有对象将作为数组返回到matchingIDs。从第一个索引获取匹配元素(假设ID是唯一的,并且只有一个)

    matchingIDs [0];

  [1]:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter

更新:

查看 findIndex 来自ECMAScript 6。

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

以来 findIndex 目前在大多数浏览器上都不可用,你可以使用它回填它 履行

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;
  };
}

5
2017-07-13 23:16



OP询问如何获取元素的索引而不是元素本身。 - epeleg
@epeleg - 我似乎没有正确地阅读这个问题。如Oleg建议的那样,循环通过每个对象并在找到匹配时断开。 - Anurag


不是很优雅,但是一个可爱的伎俩:

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

jQuery没有很多像这样的功能结构;图书馆的哲学真正专注于DOM争论的工作。他们甚至不会添加 .reduce() 功能,因为没有人能想到它对核心功能有用的原因。

Underscore.js库有很多这样的设施,它与jQuery“玩得很好”。


3
2017-07-13 22:03



很好,但效率低,因为它覆盖了数组中的所有元素...如果你查看它们,你也可以构建一个反向哈希,这样你就可以回答很多“特定ID”的Q. - epeleg
@epeleg很好,很清楚。 - Pointy


没有内置的方法;该 [].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。


1
2018-06-08 23:53





使用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 }]);

瞧。


0
2017-07-15 08:42