2013-03-18 73 views
1

我想知道是否有改善這一功能的優雅方式:使用jQuery grep()查找匹配的最簡潔方法?

function findById(id) { 
    var items = [ 
     { Id: 1, Value: 'My value 1' }, 
     { Id: 2, Value: 'My value 2' } 
    ]; 

    var result = $.grep(items, function (obj) { return obj.Id === id; }); 

    return result.length > 0 ? result[0] : null; 
    } 

特別是,我寧願它看起來是這樣的:

function findById(id) { 
    var items = [ 
     { Id: 1, Value: 'My value 1' }, 
     { Id: 2, Value: 'My value 2' } 
    ]; 

    return $.grep(items, function (obj) { return obj.Id === id; })[0] || null; 
    } 

這顯然是一個很大的一堆失敗,但這個想法是,也許有一個更清晰的寫作功能的方式。沒有什麼大不了的,但我想我會寫這個以防萬一我失去了一些東西。

[編輯]正如指出的那樣,理想的代碼工作就好了。我錯誤地認爲訪問一個空數組的第一個元素會拋出一個錯誤,但是它會返回undefined。謝謝大家!

+2

你試過了嗎?它應該工作正常。問題在哪裏? – 2013-03-18 16:03:45

回答

2

你的「理想」的代碼工作正常。在C#中,此功能稱爲FirstOrDefault

這是目前沒有內置到JavaScript(或jQuery的AFAIK),然而在接下來的版本it will likely be added

我們的好朋友弗洛裏安寫了一個小功能,它可以讓你用你的願望稱爲or的語法。

這:

function or(arr, callback, context) { 
    var el; 
    for (var i = 0, l = arr.length; i < l; i++) { 
     el = arr[i]; 
     if (callback.call(context, el, i, arr)) { 
      return el; 
     } 
    } 
    return null;//to return null and not undefined 
} 

實施例:

or([1,2,3],function(elem){ return i>2;}); //returns 3; 
or([1,2,3],function(elem){ return i>3;}); //returns null; 
or([1,2,3],function(elem){ return i>1;}); //returns 2; 

在您的例子,這將是

return or(items, function (obj) { return obj.Id === id; }); 

一個優點是它不會通過整個陣列迭代如果它在中間找到匹配的話。如果你的陣列很大,這是一個很大的區別。