15

我正在查看我目前正在编写的一些 jQuery 代码,它对我的​​ C# 大脑来说看起来很奇怪。有没有更好的方法来做到这一点?

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 返回一个数组,而不是它是一个查找类型函数,它是一个过滤类型函数,所以我想问题应该是真的有一个函数只会返回一个项目而不是一个数组吗?

4

6 回答 6

14

This answer to another question指出,即使找到正确答案,grep 也会继续遍历数组。在上面的示例中不是问题,但如果您的数组可能更大,则值得注意:非 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
    }
}
于 2013-08-02T15:08:12.610 回答
3

好吧,如果你喜欢使用 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 result = $.findFirst( myArray, function(elm) {
    return elm.id == idToLookFor;
});

当然,您可以改为使用自己的命名空间...

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

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

于 2013-10-21T18:35:50.610 回答
1

扩展 Blazemonger 的评论:

var itemFound = myArray[idToLookFor - 1]

如果我正确理解您的问题,应该会为您提供您正在寻找的物品。注意 -1 以说明从 1 开始的索引

编辑:这还假设数组将始终按 ID 升序排序,就像您的问题一样。如果您的 id 确实增加得很好,但数组最初没有按它们排序,请参阅:Sort array of objects by string property value in JavaScript

于 2013-08-02T13:46:02.867 回答
0

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

var result = myArray.filter(function(v) {
    return v.id === idToLookFor; 
})[0];

对于一个简单的数组,您可以使用inArray 。它返回项目所在的数组的键!

var itemFound= myArray[$.inArray(idToLookFor,myArray)];

于 2013-08-02T13:40:44.120 回答
0

在这里查看我的答案

复制自 Array.find 的 polyfill Array.prototype.find 代码,并将数组添加为第一个参数。

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

于 2019-05-06T19:20:42.980 回答
0

请用

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];
于 2015-12-21T05:09:14.893 回答