Underscore.js findLast()方法

时间:2013-09-03 22:12:11

标签: javascript underscore.js

Underscore.js是否有findLast()方法或等效方法?

执行.find()的最佳方式是什么,但返回Collection中匹配的最后一项?

3 个答案:

答案 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,你可以

如果您只处理数组并且不关心对象,那么这就是它的样子:

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