jQuery:数组索引中的元素索引

时间:2010-07-13 21:57:42

标签: javascript jquery arrays

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

5 个答案:

答案 0 :(得分:5)

<德尔>
See [`Array.filter`][1] to filter an array with a callback function. Each object in the array will be passed to the callback function one by one. The callback function must return `true` if the value is to be included, or false if not.

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

All objects having the ID as searchTerm will be returned as an array to matchingIDs. Get the matching element from the first index (assuming ID is unique and there's only gonna be one)

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

答案 1 :(得分:4)

如果你应该在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)并缓存你在局部变量中多次使用的任何属性或索引(如上面ar.length)。 (参见例如http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

瞧。

相关问题