2

我创建了简单的函数:它有数组作为输入和 id。函数假设在给定想法之前采用所有元素。

    function takeBefore(stars, id) {
        var taken = [];
        for(var i = 0, length = stars.length; i < length; i++) {
            if (stars[i].itemId === id) {
                break;
            }

            taken.push(stars[i]);
        }

        return taken;
    }

下面的代码可以完成这项工作,但最近我变得有点挑剔。想摆脱 for-loop 和一些功能风格。

是否可以使用underscoreES5功能来完成相同的工作?

4

2 回答 2

1

这种东西通常称为takeWhile/ dropWhile。您可以使用布尔迭代器来实现它们every()

function takeWhile(array, predicate) {
    var pos = -1;
    var all = array.every(function(x, n) { 
        return (pos = n), predicate(x);
    })
    return array.slice(0, pos + all);
}

function dropWhile(array, predicate) {
    var pos = -1;
    var all = array.every(function(x, n) { 
        return (pos = n), predicate(x);
    })
    return array.slice(pos + all);
}


a = [1,2,3,4,5,6,7]
b = takeWhile(a, function(x) { return x < 5 }) // 1,2,3,4
b = dropWhile(a, function(x) { return x < 5 }) // 5,6,7
于 2013-05-11T07:06:09.760 回答
0

你可以这样做:

x = [1,2,3,4,5];
x.slice(0, x.indexOf(3));

结果:

[1, 2]
于 2013-05-11T07:11:13.703 回答