2013-05-11 57 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]