我想用_.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))
更好?
答案 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。