2016-08-11 2 views
0

Ich habe eine Liste von Zeilen und ich möchte ein boolesches Flag setzen, abhängig davon, ob für eine von ihnen die WeekHrs-Eigenschaft auf Null gesetzt ist. Also ich habe diesen Code, der funktioniert. Es ist jedoch ineffizient, da die ForEach-Schleife brechen sollte, sobald das Flag auf false gesetzt ist. Also muss es einen besseren Weg geben, dies zu tun?Knockout: Suche nach Null in einem beobachtbaren Array

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

Ich schaute auf die anderen Dienstprogramme, aber ich kann nicht herausfinden, wie man sie für dieses Problem verwendet.

Antwort

2

Moderne Browser implementieren Array.prototype.some und every, die jederzeit zurückkehren können. every wird zurückgegeben, wenn die Testmethode false zurückgibt. Einige Ergebnisse werden zurückgegeben, wenn die Testmethode true zurückgibt.

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; 
    }); 
} 

Beachten Sie, dass diese Methode auch in einem computed verwenden könnte, falls erforderlich:

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

Bearbeiten der Vollständigkeit halber: Wie in den Kommentaren vorgeschlagen, können Sie natürlich eine regelmäßige for nutzen könnten Schleife:

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; 
}; 

Zusätzlich könnten Sie die vorgeschlageneimplementierenwenn Sie < IE9 unterstützen müssen.

+0

Und wenn Sie ältere Browser unterstützen müssen, können Sie Utilities wie 'some' und' arrayForEach' einfach umgehen und nur eine Standardschleife 'for' verwenden. Nur weil die neueren Methoden da sind, bedeutet das nicht, dass Sie sie verwenden müssen, wenn die älteren Methoden besser geeignet sind. –

+0

@JamesThorpe, ich habe das 'for'-Äquivalent eingeschlossen, das Sie vorgeschlagen haben. Beachten Sie, dass "einige" schon seit einiger Zeit in der Spezifikation sind (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.17). Persönlich glaube ich, wir sollten nicht zu ängstlich sein, um die neueren Funktionen zu übernehmen ... – user3297291

+0

Oh absolut - die neueren Funktionen sorgen für viel besseren Code. Aber sie können manchmal auch in die Quere kommen. Sehen Sie sich den OP-Code und Ihr "ein paar" Beispiel an - ich habe vielleicht zu viele doppelte Negative in meinem Kopf, aber ich bin mir nicht sicher, ob Ihr Code dem Original entspricht. (Gehirn tut zu sehr weh, wenn man im Mo darüber nachdenkt!) –

Verwandte Themen