Underscore.js是否有findLast()
方法或等效方法?
执行.find()
的最佳方式是什么,但返回Collection中匹配的最后一项?
答案 0 :(得分:11)
撤消列表,然后使用find
:
_.find(list.reverse(), iterator);
阅读MDN以获取reverse
上的文档。
不幸的是,下划线中的集合可能是数组或对象。如果你的收藏是一个阵列,那么你很幸运。您可以使用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(0).reverse(), iterator, context);
else return _.find(Object.keys(list).reverse(), function (key) {
return iterator.call(context, list[key], key, list);
});
}
});
现在,您可以像使用任何其他下划线方法一样使用findLast
。
答案 1 :(得分:3)
根据@AaditMShah的建议,使用reverse
是最简单的解决方案,但要注意它操纵数组in place。如果您需要保留元素的顺序,则必须在完成后再次调用reverse
。
如果你don't want to use reverse
,你可以
_.findLast
findLast
和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;
}
(它有效,但我还没有正确测试过。所以对于读过这个的人来说,请先运行一些测试,不要只复制代码。)
答案 2 :(得分:2)
Underscore 1.8.0引入了一种方法findLastIndex,可用于完成此任务。
var numbers = [1, 2, 3, 4];
var index = _.findLastIndex(numbers, isOddNumber);
if (index > 0) { console.log(numbers[index]); }
// returns 3