2016-08-11 27 views
0

私は行のリストを持っていて、そのうちのどれかにWeekHrsプロパティがゼロに設定されているかどうかに応じてブールフラグを設定したい。 だから私はこのコードが動作します。しかし、フラグがfalseに設定されるとForEachループが壊れるので非効率です。 これを行うにはより良い方法が必要ですか?ノックアウト:観測可能な配列のゼロを検索する

self.isFull = function() { 
    var isFull = true; 
    ko.utils.arrayForEach(self.Lines(), 
     function (line) { 
      if (line.WeekHrs() === 0) { 
       isFull = false; 
      } 
     }); 
    return isFull; 
}, 

私は他のユーティリティを見ましたが、私はこの問題のためにそれらを使用する方法を考え出すことができません。

答えて

2

最新のブラウザには、Array.prototype.someeveryが実装されています。いずれの時点でも返すことができます。 everyは、テストメソッドがfalseを返すときに戻り、テストメソッドがtrueを返すときに戻ります。

self.isFull = function() { 
    return self.Lines().every(function(line) { 
    return line.WeekHrs() !== 0; 
    }); 
}; 

self.isFull = function() { 
    return !self.Lines().some(function (line) { 
    return line.WeekHrs() === 0; 
    }); 
} 

必要であれば、あなたも、computedにこの方法を使用することができます注:完全性について

self.isFullComputed = ko.pureComputed(self.isFull) 

編集:コメントで示唆したように、あなたはもちろん、通常のforを使用することができますがループ:

self.isFull = function() { 
    var allLines = self.Lines(), 
     length = allLines.length, 
     i; 

    for (i = 0; i < length; i += 1) { 
    if (line.WeekHrs() === 0) { 
     return false; 
    } 
    } 

    return true; 
}; 

さらに、提案された IE9をサポートする必要がある場合は。

+0

古いブラウザをサポートする必要がある場合は、 'some'や' arrayForEach'のようなユーティリティをバイパスして、単にforループを使用することができます。ちょうど新しいメソッドがあるからといって、古い方法が適切なときにそれらを使用しなければならないというわけではありません:) –

+0

@JamesThorpe、あなたが提案した同等のものを含めました。 'some'はしばらくの間specに入っていたことに注意してください(http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.17)。個人的には、新しい機能を採用するのはあまりにも恐れてはいけないと思います... – user3297291

+0

ああ、絶対に - 新しい機能は、もっときれいなコードを提供します。しかし、時には彼らは途方もないこともあります。 OPsのコードとあなたの 'some'の例を見直してみてください - 私は頭の中でダブルネガティブが起こっているかもしれませんが、あなたのコードが元のものとマッチしているかどうか分かりません。 (脳はあまりにも多くのモーメントでそれについて考えることを傷つけている!) –

関連する問題