获取与迭代器函数匹配的集合的第一个元素

时间:2013-10-21 14:39:56

标签: javascript collections functional-programming underscore.js

我想用_.first_.filter来实现这样的东西,也就是说,有一个元素集合,我想获得与真值测试匹配的第一个(如果存在)(迭代)。

例如,给定如下数组:

var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}]

我想获得与我的自定义函数匹配的第一个(也是唯一的第一个)元素:

_.filterFirst(arr, function(el) { return el.a > 10; }); // make it

到目前为止:

_.first(arr) == {a:1}
_.filter(arr, function(...)) == [{a:11}, {a:15}]

有没有一个干净的解决方案,这比_.first(_.filter(arr, iterator))更好?

4 个答案:

答案 0 :(得分:73)

您可以使用find

  

查看列表中的每个值,返回第一个值   传递真值测试(迭代器),如果没有值传递,则传递未定义   测试。一旦找到可接受的元素,函数就会返回,   并且不会遍历整个列表。

使用您的示例:

var g = _.find(arr, function (x) { return x.a > 10 })

请参阅主页:http://underscorejs.org

需要注意的另一件事(可能是您的问题)是chain函数一起加入调用:

var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value()

注意对filter和“first”的调用,这些调用可以在没有任何嵌套的情况下相互跟随。

答案 1 :(得分:0)

“_。find”是一个很好的解决方案。

另一种解决方案,可能更快,就是以这种方式使用“Array.prototype.every”:

var match;
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; })

答案 2 :(得分:0)

_。find-在lodash中: https://lodash.com/docs/4.17.10#find

.pem

答案 3 :(得分:0)

添加标准的 JavaScript Array.prototype.find 方法,因为旧的答案会让新人不了解:

const array1 = [5, 12, 8, 130, 44];
const found = array1.find(element => element > 10);
console.log(found); 
// expected output: 12

示例来自上面链接的 MDN 页面。 还有一个 Array.prototype.findIndex 方法返回谓词产生 true 的位置的索引,而不是该索引的数组元素。

这些方法在 ES2015 中,即。 5 岁并且几乎在人们使用的所有浏览器中,请参阅此 caniuse link