Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:数组中元素的索引,其中谓词_Javascript_Jquery_Arrays - Fatal编程技术网

Javascript jQuery:数组中元素的索引,其中谓词

Javascript jQuery:数组中元素的索引,其中谓词,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个对象数组。除其他外,每个对象都有一个ID属性。我想在具有特定ID的对象数组中查找索引。在jQuery中有什么优雅而简单的方法可以做到这一点吗?不是很优雅,而是一个可爱的技巧: var index = parseInt( $.map(array, function(i, o) { return o.id === target ? i : ''; }).join('') ); jQuery没有很多这样的函数结构;图书馆的哲学真正集中在DOM争论的工作上。他们甚至不会添加.reduce(

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

不是很优雅,而是一个可爱的技巧:

var index = parseInt(
  $.map(array, function(i, o) { return o.id === target ? i : ''; }).join('')
);
jQuery没有很多这样的函数结构;图书馆的哲学真正集中在DOM争论的工作上。他们甚至不会添加
.reduce()
函数,因为没有人能想到它对核心功能有用的原因


Underline.js库有很多这样的功能,它与jQuery“配合得很好”。

在这种情况下,您应该在javascript中使用
for
循环,而不是使用jQuery。参见中的方式3

更新: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
}
for(变量i=0,l=ar.length;i
由于
findIndex
在大多数浏览器上还不可用,您可以使用以下方法对其进行回填:

if(!Array.prototype.findIndex){
Array.prototype.findIndex=函数(谓词){
if(this==null){
抛出新的TypeError('Array.prototype.findIndex调用为null或未定义');
}
if(类型谓词!=='function'){
抛出新类型错误('谓词必须是函数');
}
变量列表=对象(此);
var length=list.length>>>0;
var thisArg=参数[1];
var值;
对于(变量i=0;i
使用jOrder

将数组馈送到jOrder表中,并在“ID”字段上添加索引

var table = jOrder(data)
    .index('id', ['ID']);
然后,通过以下方式获取元素的数组索引:

var arrayidx = table.index('id').lookup([{ ID: MyID }]);
如果需要整行,则:

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

瞧。

没有用于此的内置方法;该方法不接受谓词,因此您需要一些自定义的内容:

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

更新

您现在可以使用以下功能:

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

console.log(索引)/2
OP询问如何获取元素的索引,而不是元素本身。@epeleg-我似乎没有正确阅读问题。按照Oleg的建议,循环遍历每个对象并在找到匹配项时中断。这正是我要寻找的。太糟糕了,没有优雅的解决方案确实……不错,但效率很低数组中的所有元素……如果你对它们进行检查,你可能会构建一个反向散列,这样你就可以回答许多“specific id”的Q。
var arrayidx = table.index('id').lookup([{ ID: MyID }]);
var filtered = table.where([{ ID: MyID }]);
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';
});