2012-07-05 111 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]; 
} 

这会返回第一个匹配谓词(或未定义)的项目,然后停止迭代 - 这对于巨大的数组或者谓词函数很复杂时可能非常方便。

相关问题