2011-05-16 77 views
3
// temp data 
var array = [1,2,function() { }, 3, function() { }]; 
var cb = function() { console.log("foo"); } 


var found = false; 
console.log(_.map(array, function(val) { 
    if (_.isFunction(val) && !found) { 
     return found = true, _.compose(cb, val); 
    } 
    return val; 
})); 

這循環遍歷數組,並將它找到的第一個函數變成一個組合函數。使一個簡單的搜索算法更優雅

我討厭found = false變量/計數器。我如何擺脫它?

作爲算法。

let found be 0 
map value in array 
    if value satisfies condition and found is 0 
     let found be 1 
     return mutate(value) 
    else 
     return value 

更新

使用for循環

for (var i = 0; i < array.length; i++) { 
    if (_.isFunction(array[i])) { 
     array[i] = _.compose(cb, array[i]); 
     break; 
    } 
} 

_.map__.isFunction_.compose

+1

是不是有一個'打破'語言中的聲明?我會用它來擺脫循環。 – 2011-05-16 21:57:28

+0

@PeteWilson這就是我的想法。然後,我需要一個正常的循環,而不是枚舉。我想我會用for來重構它。 – Raynos 2011-05-16 22:00:39

+0

在'console.log'中是否包含循環在這裏執行任何操作?該循環不會返回值 - 在Chrome控制檯中運行該值只會輸出「未定義」。 – nrabinowitz 2011-05-16 22:11:59

回答

1

假設短路評價:(我及時bastardise)

let found be 0 
for each value in array 
    if value satisfies condition and found is 0 and let found be not found 
     let value be mutate(value) 

編輯的問題,編輯答案:

let found be 0 
for each value in array 
    return (value satisfies condition and found is 0 and let found be not found) ? mutate(value) : value 
+1

+1的混蛋! – Raynos 2011-05-16 22:09:20

+0

我選擇這個,因爲它不是線> _> – Raynos 2011-05-16 22:27:15

3

我不知道這是否回答您的高雅需求,但在我看來,像​​或forEach是浪費額外的循環項目已被後找到。使用傳統的forwhile循環,您可以在該位置呼叫break。對於一個小陣列沒什麼大不了的,但它可能會成爲更大陣列或複雜條件檢查的問題。如果你想避免不斷的array[x]參考,你可以得到一個比明顯的選項小一點:

for (var val, x=0; x<array.length; val=array[++x]) { 
    if (_.isFunction(val)) { 
     array[x] = _.compose(cb, val); 
     break; 
    } 
} 
+1

對於'val = array [++ x] +1'這很聰明(hacky)。 – Raynos 2011-05-16 22:30:25