2013-05-11 63 views
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函数来做同样的工作?

回答

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 
+0

的作品真的很好!你可以plz扩展'every' ..我认为它返回布尔值,它如何作为pos + all使用? – 2013-05-11 08:22:02

+0

@alexanderb:这实际上是一个黑客。当与'+'一起使用时,布尔变换为整数(true = 1,false = 0),我用它来将位置移动一个以防所有元素匹配谓词。 – georg 2013-05-11 08:25:07

0

你可以做这样的事情:

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

结果:

[1, 2]