Javascript jQuery Grep alternations返回一个项目

Javascript jQuery Grep alternations返回一个项目,javascript,jquery,Javascript,Jquery,我正在看我目前正在写的一些jQuery代码,它在我的C#brain看来很奇怪。有更好的方法吗 var idToLookFor = 2; var myArray = [{id:1},{id:2},{id:3}] var arrayItem = $.grep(myArray , function (elm) { return elm.id == idToLookFor; }); var itemFound = arrayItem[0]; 我可以理解grep返回一个数组,而不是一个fin

我正在看我目前正在写的一些jQuery代码,它在我的C#brain看来很奇怪。有更好的方法吗

var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.grep(myArray , function (elm) {
    return elm.id == idToLookFor;
});

var itemFound = arrayItem[0];

我可以理解grep返回一个数组,而不是一个find类型函数,它是一个filter类型函数,所以我想问题应该是,是否真的有一个函数只返回一个项而不是一个数组?

如果您有一个对象数组,这可以:

var result = myArray.filter(function(v) {
    return v.id === idToLookFor; 
})[0];
对于可以使用的简单数组。它返回项目所在数组的键

var itemFound=myArray[$.inArray(idtolookformyarray)]


扩大Blazemonger的评论:

var itemFound = myArray[idToLookFor - 1]
如果我没弄错你的问题,我会帮你找到你要找的东西。请注意-1表示从1开始的索引


编辑:这还假设数组总是按ID按升序排序,就像您的问题一样。如果您的id的增量很好,但数组最初没有按它们排序,请参见:

对另一个问题的回答指出,即使找到正确答案,grep仍将继续在数组上循环。在上述示例中不是问题,但如果阵列可能更大,则值得注意:

它只是一个for循环,被包装在一个函数中,该函数返回它找到的对象。即使您坚持使用grep方法,我仍然会将您的逻辑抽象为一些可重用的函数,并将其保存在某个好的帮助文件中

我发布了一个修改版的答案,纯粹是为了让你在决定是否要关注链接之前明白我的意思:

for (var i = 0, len = myArray.length; i < len; i++) 
{
    if (myArray[i].id === idToLookFor)
    {
        return myArray[i]; // Return as soon as the object is found
    }
}
for(变量i=0,len=myArray.length;i
如果您喜欢使用jQuery通用函数样式,可以在您的个人库中添加如下内容:

$.extend( {
    findFirst: function( elems, validateCb ){
        var i;
        for( i=0 ; i < elems.length ; ++i ) {
            if( validateCb( elems[i], i ) )
                return elems[i];
        }
        return undefined;
    }
} );
当然,您可以使用自己的名称空间

我想您关心的是代码的可读性。我认为直接使用语言循环解决方案也很好

您也可能会担心浪费,因为不需要为此维护另一个阵列结构,但至少对于您的示例而言,这似乎是一个微观优化问题。

请使用

var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.map(myArray , function (elm) {
    if(elm.id == idToLookFor)
      return elm.id ;
});

var itemFound = arrayItem[0];

从Array.find的polyfill Array.prototype.find代码中复制,并添加该数组作为第一个参数


您可以将搜索项作为谓词函数传递

是的,您已经在最后一行使用了它。如果您只需要数组中的第一个匹配项,直到您得到它为止?我认为这可能只是一个输入错误[在问题中],但上述方法不起作用,
myArray
不包含任何名为
Id
的属性的对象是的,这是一个输入错误:)@Jammer,您可以在
grep
中返回元素?类似这样的内容
var arrayItem=$.grep(myArray,function(elm){if(elm.id==idToLookFor)返回elm;})。如果它与任何内容都不匹配,它将返回一个空数组。这只适用于值数组。问题中的数组是一个对象数组。如果只需要第一次出现,为什么要过滤整个数组?for循环更快更好如果项目确实已排序,这是一个很好的解决方案。我认为数组项目“id”属性与数组中的索引没有任何关系。Blazemonger所说的是,要获取数组中的第一个元素,只需使用
[0]
,仅此而已。啊,我明白了,我只是认为id从1开始,然后递增1,而不仅仅是一个任意数字。如果是这种情况,那么在使用我的解决方案之前,可以根据id值对数组进行排序。
var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.map(myArray , function (elm) {
    if(elm.id == idToLookFor)
      return elm.id ;
});

var itemFound = arrayItem[0];