以功能样式重写循环

时间:2013-05-11 07:00:36

标签: javascript functional-programming

我创建了简单的函数:它有数组作为输入和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函数执行相同的工作?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你可以这样做:

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

结果:

[1, 2]