Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数式重写周期_Javascript_Functional Programming - Fatal编程技术网

Javascript 函数式重写周期

Javascript 函数式重写周期,javascript,functional-programming,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; }

我创建了一个简单的函数:它有数组作为输入和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;
    }
函数takeBefore(星号,id){
风险值=[];
对于(变量i=0,长度=stars.length;i
下面的代码可以完成这项工作,但最近我变得有点挑剔了。想要摆脱for循环和一些功能性风格


可以使用
下划线
ES5
函数来完成相同的工作吗?

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

函数takeWhile(数组,谓词){
var pos=-1;
var all=array.every(函数(x,n){
返回(pos=n),谓词(x);
})
返回数组.slice(0,pos+all);
}
函数dropWhile(数组、谓词){
var pos=-1;
var all=array.every(函数(x,n){
返回(pos=n),谓词(x);
})
返回数组.slice(pos+all);
}
a=[1,2,3,4,5,6,7]
b=takeWhile(a,函数(x){returnx<5})//1,2,3,4
b=dropWhile(a,函数(x){returnx<5})//5,6,7

您可以这样做:

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

[1, 2]

那真的很好用!你能把
每一个
都解释一下吗。。我以为它会返回布尔值,为什么它会被用作pos+all?@alexanderb:这实际上是一个黑客攻击。当与
+
一起使用时,布尔值被转换为int(true=1,false=0),我用它将位置移动1,以防所有元素都匹配谓词。
[1, 2]