Underscore.js是否有findLast()方法或等效方法?
除了返回集合中的最后一个匹配项之外,做.find()的最佳方法是什么?
发布于 2013-09-03 22:16:17
反转列表,然后使用find
_.find(list.slice().reverse(), iterator);有关reverse的文档,请阅读MDN。
不幸的是,下划线中的集合可能是数组,也可能是对象。如果您的集合是一个数组,那么您是幸运的。您可以使用reverse。但是,如果它是一个对象,则需要这样做:
_.find(Object.keys(list).reverse(), function (key) {
return iterator(list[key], key, list);
});您可以自己编写一个findLast函数:
_.mixin({
findLast: function (list, iterator, context) {
if (list instanceof Array)
return _.find(list.slice().reverse(), iterator, context);
else return _.find(Object.keys(list).reverse(), function (key) {
return iterator.call(context, list[key], key, list);
});
}
});现在,您可以像其他任何下划线方法一样使用findLast。
发布于 2015-12-24 16:07:32
下划线1.8.0引入了一个方法findLastIndex,它可以用来实现这一点。
var numbers = [1, 2, 3, 4];
var index = _.findLastIndex(numbers, isOddNumber);
if (index > 0) { console.log(numbers[index]); }
// returns 3发布于 2014-01-07 14:55:33
正如@AaditMShah所建议的那样,使用reverse是最简单的解决方案,但请注意,它操作数组就位。如果需要保留元素的顺序,则必须在完成之后第二次调用reverse。
如果你reverse,你可以
_.findLastfindLast和forEachRight上展开,并创建自己的findLast。如果您只处理数组而不关心对象,这就是它的样子:
function findLast (array, callback, thisArg) {
var index = array.length,
last;
callback = callback && typeof thisArg == 'undefined' ? callback : _.bind(callback, thisArg);
while (index--) {
if (callback(array[index], index, array) == true) {
last = array[index];
break;
}
}
return last;
}(它起作用了,但我还没有对它进行适当的测试。因此,对于任何阅读这篇文章的人,请先运行一些测试,而不是仅仅复制代码。)
https://stackoverflow.com/questions/18602325
复制相似问题