Sagen wir x
, a
und b
sind Zahlen. Ich muss mich x
an die Grenzen des Segments halten [a, b]
.
Ich kann schreiben Math.max(a, Math.min(x, b))
, aber ich denke nicht, dass es sehr einfach zu lesen ist. Hat jemand eine clevere Möglichkeit, dies besser lesbar zu schreiben?
javascript
coding-style
Samuel Rossille
quelle
quelle
Math.min
undMath.max
ist irrelevant , solange der ParameterMath.min
istmax
und der Parameter derMath.max
istmin
.Number.prototype
in diesem Fall) ist aus verschiedenen Gründen nicht ratsam. Siehe "Schlechte Praxis: Erweiterung nativer Prototypen" unter developer.mozilla.org/en-US/docs/Web/JavaScript/…Ein weniger "mathematisch" orientierter Ansatz, der aber auch funktionieren sollte. Auf diese Weise wird der </> Test angezeigt (möglicherweise verständlicher als Minimaxing), aber es hängt wirklich davon ab, was Sie unter "lesbar" verstehen.
quelle
Math.random()
Anruf entfernen , ist dieser einfache Ansatz zehnmal schneller .Update für ECMAScript 2017:
Beachten Sie jedoch, dass es sich ab heute um einen Vorschlag der Stufe 1 handelt . Bis es weitgehend unterstützt wird, können Sie eine Polyfüllung verwenden .
quelle
quelle
prototype
sehr elegante zu erweitern, wenn es darum geht, die Funktion tatsächlich zu nutzen.Dies möchte keine "Just-Use-a-Library" -Antwort sein, aber nur für den Fall, dass Sie Lodash verwenden, können Sie Folgendes verwenden
.clamp
:Damit:
Hier ist die Implementierung aus der Lodash- Quelle :
Es ist auch erwähnenswert, dass Lodash einzelne Methoden als eigenständige Module zur Verfügung stellt. Wenn Sie also nur diese Methode benötigen, können Sie sie einfach ohne den Rest der Bibliothek installieren:
quelle
Wenn Sie es6-Pfeilfunktionen verwenden können, können Sie auch einen Teilanwendungsansatz verwenden:
quelle
Wenn Sie keine Funktion definieren möchten,
Math.min(Math.max(x, a), b)
ist es gar nicht so schlecht , sie so zu schreiben .quelle
Im Geiste der Pfeilsexiness könnten Sie eine Mikroklemme / Constrain / Gate / & c erstellen. Funktion mit Ruheparametern
Dann geben Sie einfach drei Werte ein
Das heißt, wenn mit sexy gemeint ist, meinst du "kurz"
quelle
clamp
, perf wird einen ernsthaften SchlagDies erweitert die ternäre Option zu if / else, das minimiert der ternären Option entspricht, jedoch nicht die Lesbarkeit beeinträchtigt.
Minimiert auf 35b (oder 43b bei Verwendung
function
):Abhängig davon, welches Perf-Tool oder welchen Browser Sie verwenden, erhalten Sie verschiedene Ergebnisse darüber, ob die mathematische oder die ternäre Implementierung schneller ist. Bei ungefähr gleicher Leistung würde ich mich für die Lesbarkeit entscheiden.
quelle
Mein Favorit:
quelle
[1,5,19].sort()[1]
gibt 19 zurück. Es könnte so behoben werden:[min,x,max].sort(function(a, b) { return a - b; })[1]
aber das ist nicht mehr sexy. Abgesehen davon, dass es häufig verwendet wird, kann es ein Leistungsproblem sein, ein neues Array zu erstellen, um nur drei Zahlen zu vergleichen.[min, x, max].sort((a,b) => a-b)[1]