【发布时间】:2010-07-13 21:57:41
【问题描述】:
我有一个对象数组。除其他外,每个对象都有一个 ID 属性。我想在具有特定 ID 的对象的数组中找到索引。在 jQuery 中是否有任何优雅而简单的方法可以做到这一点?
【问题讨论】:
-
正是我也在寻找的。太糟糕了,确实没有优雅的解决方案......
标签: javascript jquery arrays
我有一个对象数组。除其他外,每个对象都有一个 ID 属性。我想在具有特定 ID 的对象的数组中找到索引。在 jQuery 中是否有任何优雅而简单的方法可以做到这一点?
【问题讨论】:
标签: javascript jquery arrays
更新:
从 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;
};
}
【讨论】:
如果您应该在 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)
【讨论】:
不是很优雅,而是一个可爱的把戏:
var index = parseInt(
$.map(array, function(i, o) { return o.id === target ? i : ''; }).join('')
);
jQuery 没有很多这样的函数式结构。该库的理念是真正专注于 DOM 争吵的工作。他们甚至不会添加 .reduce() 函数,因为没人能想到它对核心功能有用的原因。
Underscore.js 库有很多这样的工具,而且它与 jQuery “配合得很好”。
【讨论】:
没有用于此的内置方法; [].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
【讨论】:
使用 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 }]);
瞧。
【讨论】: