2013-08-10 12 views
5

Wir arbeiten an einer Programmieraufgabe, um die Funktionalität von underscore.js in Standardjavascript zu implementieren. Speziell arbeite ich an der Implementierung der _.some Funktion. (http://underscorejs.org/#some) Der Teil Ich kämpfe mit ist es mich fragt, einen Weg zu finden, um es zu lösen _.every intern verwenden. (http://underscorejs.org/#every)Wie löst man _.some mit _.every?

Ich habe bereits die _.every Funktion früher beendet und es funktioniert wie es sollte. Hier

ist logisch, was ich in skizzierte Code tun bin zu wollen:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, !truthStatementFunction)) 
} 

oder in Englisch, drehen die Wahrheit Aussage zu testen, wo die Bedingung falsch ist ... und wenn der _.every Test dann true zurück ... dann wissen wir, dass _.some der ursprünglichen Wahrheit Aussage falsch ist (so die Rückkehr der _.every Flip die richtige Rückkehr für _some zu bekommen). Ebenso, wenn _.every false zurückgibt, dann klappen Sie das um, um die korrekte Rückgabe von true für _.some zu erhalten.

Offensichtlich ist das Problem mit dieser Skizze ist der !truthStatementFunction Teil. Wie komme ich in diesen Iterator, um die Interna der Funktion zu ändern, um sie umzukehren? Scheint nicht, dass die Interna der Funktion zugänglich sind ...

Bin ich den falschen Baum völlig bellend, und es gibt einen besseren Weg, um dies mit _.every zu lösen?

+1

Sie haben die richtige Idee. Allerdings müssen Sie den '!' - Operator und die Funktion [https://en.wikipedia.org/wiki/Function_composition] verfassen. es ist etwas wie 'function (x) {return! truthStatementFunction (x)}' anstatt nur '! truthStatementFunction'. –

+1

Um Ihre Frage zu beantworten ... Es ist eine Lernübung so der Punkt, zu lernen, ist, eine oder andere Weise (obwohl ich es 100% auf meinem eigenen Know Lösung wäre der effektivste Weg zu lernen, immer zu lange stecken und Zeit zu verschwenden dass ich andere nützliche Dinge lernen könnte, tut mir nicht gut). Ich würde hier lieber einen Hinweis als eine direkte Antwort erhalten, aber ich war mir nicht sicher, ob das mit den scheinbar strengen Regeln des Stack-Overflows in Konflikt geraten würde. – jjj

Antwort

9

Pass _every eine Funktion, die eine Umkehrung des Ergebnisses aus truthStatementFunction zurück:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) { 
     return !truthStatementFunction(v); 
    })); 
} 

den zweiten Teil Ihrer Frage zu beantworten:

und gibt es einen besseren Weg, dies zu lösen unter Verwendung von _.jeden?

Es gibt definitiv eine bessere Lösung als _.every. Iterieren Sie einfach über die Sammlung und geben Sie true zurück, sobald Sie ein übereinstimmendes Element gefunden haben. Viel effizienter in Fällen, in denen _.some True zurückgibt, da es Ihnen nicht wirklich wichtig ist, wie viele Elemente in der Sammlung das Prädikat erfüllen, solange mindestens eins vorhanden ist.

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) { 
     if (pred(c[i])) return true; 
    } 
    return false; 
} 
+0

Danke! Mit allen Bereichen suchen Ich war ich vergessen, dass ich explizit die Funktion definieren konnte ich in _.every vorbei (_.every selbst intern verwendet, ist _.reduce der Herausforderung gerecht zu werden, so dass die Bereiche beginnen, ein wenig verwirrend zu bekommen !) am Ende von der Art und Weise zu lösen _.every weiter verwendet, nicht nICHT mit _every ... ich stimme all dies ein for-Schleife viel einfacher, als wäre ich gefragt wurde, ob es ein besserer Weg! – jjj

+0

@ggg Der Grund, warum ich eine For-Schleife vorgeschlagen habe, war nicht Einfachheit, sondern eher Effizienz. Die Verwendung des '_.every'-Ansatzes ist * viel * langsamer (im Durchschnitt) als die einfache Iteration. –