2013-08-02 12 views
10

我在看我正在寫的一些jQuery代碼,它看起來很奇怪我的C#腦子。有沒有更好的方法來做到這一點?jQuery Grep替代品返回一個項目

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

是的,你已經在上線使用。 – Blazemonger

+0

如果你只是需要在數組中第一次出現,只需[循環數組](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for),直到你得到它? – NDM

+0

我認爲它可能只是一個錯字[在問題中],但上述不起作用,'myArray'不包含任何名稱爲'Id'的屬性對象 – billyonecan

回答

8

對另一個問題的回答指出,即使找到了正確的答案,grep仍會繼續在數組上循環。在上面的例子中沒有問題,但如果你的數組可能更大,值得注意的是:non grep solution

這只是一個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 
    } 
} 
0

如果你有對象的數組,這將做到:

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

對於一個簡單的數組,您可以使用inArray。它返回數組的關鍵在項目存在!

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

+0

這隻適用於數組值。問題中的數組是一個對象數組。 –

+2

爲什麼要過濾整個數組,如果你只需要第一次出現? for循環更快,更好 – NDM

+0

你是對的,因爲循環將是直接和快速明顯:) – Aditya

1

擴展在Blazemonger的評論:

var itemFound = myArray[idToLookFor - 1] 

應該得到你要尋找的項目,如果我正確地理解你的問題。注意從-1編號索引-1 -1

編輯:這也假設數組將總是按ID升序排序,因爲它是在你的問題。如果你的編號確實增加了,但是數組並沒有按照它們排序,請看:Sort array of objects by string property value in JavaScript

+1

這是一個很好的解決方案,如果項目確實排序。 – Jammer

+2

我不認爲數組項「id」屬性與數組中的索引有任何關係。 Blazemonger說的是,要獲得數組中的第一個元素,只需使用'[0]'即可。 –

+0

啊,我看到了,我只是覺得ID從1開始加1,並不是一個任意數字。如果是這種情況,那麼在使用我的解決方案之前,可以使用id值對數組進行排序。 http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array-by-a-field-value-in-javascript – underbar

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; 
}); 

當然,你可以改爲使用你自己的命名空間...

我假設你關心的是代碼可讀性。我認爲直接使用語言循環解決方案來解決這個問題也很好。

您也可以與浪費關注,因爲沒有必要維持只爲這另一個陣列結構,但至少你的例子看起來像一個微優化問題。

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];