2010-07-13 63 views
11

我有一个对象数组。每个对象都有一个ID属性。我想在具有特定ID的对象的数组中找到索引。有没有在jQuery中做到这一点的优雅和简单的方法?jQuery:数组中元素的索引,其中谓词

+0

准确地说,我也在寻找。太糟糕了没有优雅的解决方案确实... – epeleg 2012-07-18 20:45:34

回答

4

在这种情况下,您应该在javascript中使用for循环,而不是使用jQuery。见路3 http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance/

更新: jQuery是用JavaScript编写的,它不能比也用JavaScript编写的另一个代码更快。如果你使用DOM,jQuery是非常好的,但如果你使用简单的javascript数组或对象工作,那么jQuery就没有什么帮助。

你正在寻找的代码可以是这样的:

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

3

不是真的优雅,但一个可爱的把戏:

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

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

Underscore.js库有很多这样的工具,它用jQuery“很好玩”。

+0

不错,但效率低下,因为它遍历了数组中的所有元素... 如果你仔细研究它们,你可能也会建立一个反向散列,这样你就可以回答Q “specificID” S。 – epeleg 2012-07-18 20:48:01

+0

@eleleg很好,很清楚。 – Pointy 2012-07-18 20:55:50

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 

更新:

结帐findIndex从ECMAScript中6

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

OP询问如何获取元素的索引而不是元素本身。 – epeleg 2012-07-18 20:43:26

+0

@epeleg - 我没有看到正确的问题。在Oleg建议的情况下,通过每个物体循环并在发现匹配时打破。 – Anurag 2012-07-19 00:05:58

0

使用j订购。 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 }]); 

瞧。

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如果断言永远不会产生一个truthy值。

相关问题