2012-07-05 159 views
16

是否有一個現有的函數可以找到匹配某個一般謂詞的第一個數組元素?給定一個數組和謂詞,找到第一個匹配元素

$.fn.findFirstMatching = function(predicate) { 
    var result; 
    $.each(this, function(index, value) { 
     if (predicate(index, value)) { 
      result = {index: index, value: value}; 
     } 
    }); 
    if (result) { 
     return result; 
    } 
}; 
+0

我不這麼認爲,最接近的id $ .grep匹配所有對謂詞 – 2012-07-05 12:34:24

回答

11

如果使用underscore.js,那麼你可以使用find方法。它甚至可以在存儲元素集合的jQuery對象沒有問題的情況下工作。

_.find(array, function(value,index) { /* predicate */ }); 

但除了這個額外的(但很小)的庫,你需要自己寫它。

+0

看起來不錯。事實證明,我們已經在使用下劃線,所以它更加簡單。以下是任何感興趣的人的文檔:http://underscorejs.org/#find – ripper234 2012-07-05 12:41:59

+0

值得注意的是它是'(value,index)',而不是'jQuery.each'的回調,它採用'(index,value )'。 – ripper234 2012-07-05 12:46:00

16

另一個解決方案是:

$.grep(yourArray, function (value, index) { return value == 42 })[0] 

注意的參數的順序應該是value, index

Docs for jQuery.grep.

當然,使用_underscore是更優雅和高效(如$ .grep對數組的所有項應用謂詞,它在第一次匹配後不停止) ,但無論如何:)

+0

@JLRishe,jQuery文檔聲明順序應該是'value,index'。 – Apelsin 2015-01-05 10:01:26

+0

@Apelsin事實上,你是對的。愚蠢的我,我一定假定'$ .grep'與'$ .each'一致。原來他們甚至沒有一致性。 – JLRishe 2015-01-05 11:06:28

10

由於ES2015的,你可以使用Array.prototype.find

使用的一個例子,它看起來像這樣:

// outputs the first odd number 
console.log([2,4,10,5,7,20].find(x => x%2)) 
+1

我喜歡這個答案最好,因爲它不需要任何第三方庫或框架的工作。 – northsideknight 2016-04-29 18:30:56

1

自定義實現可以是實際上相當短,至今清晰可辨:

function findFirst(array, predicate) { 
    for (var i = 0; i < array.length; i++) if (predicate(array[i])) return array[i]; 
} 

這會返回第一個匹配謂詞(或未定義)的項目,然後停止迭代 - 這對於巨大的數組或者謂詞函數很複雜時可能非常方便。

相關問題