Powiedzmy x
, a
i b
są liczbami. Muszę zmieścić x
się w granicach segmentu [a, b]
.
Potrafię pisać Math.max(a, Math.min(x, b))
, ale nie wydaje mi się, żeby było łatwe do odczytania. Czy ktoś ma sprytny sposób, aby napisać to w bardziej czytelny sposób?
javascript
coding-style
Samuel Rossille
źródło
źródło
Math.min
iMath.max
jest nieistotna, o ile parametrMath.min
jestmax
i parametrMath.max
jestmin
.Number.prototype
w tym przypadku) jest niewskazane z różnych powodów. Zobacz „Złe praktyki: rozszerzenie natywnych prototypów” na stronie developer.mozilla.org/en-US/docs/Web/JavaScript/…podejście mniej zorientowane na matematykę, ale powinno również działać, w ten sposób test </> jest ujawniony (może być bardziej zrozumiały niż minimaksowanie), ale tak naprawdę zależy od tego, co rozumiesz przez „czytelny”
źródło
Math.random()
połączenia, to proste podejście jest 10 razy szybsze .Aktualizacja dla ECMAScript 2017:
Należy jednak pamiętać, że na dzień dzisiejszy jest to propozycja etapu 1 . Dopóki nie uzyska szerokiego wsparcia, możesz używać polyfill .
źródło
źródło
prototype
bardzo eleganckiego, jeśli chodzi o faktyczne korzystanie z funkcji.To nie jest odpowiedź typu „po prostu użyj biblioteki”, ale na wypadek, gdybyś korzystał z Lodash, możesz użyć
.clamp
:Po to aby:
Oto jego implementacja, zaczerpnięta ze źródła Lodash :
Warto również zauważyć, że Lodash udostępnia pojedyncze metody jako samodzielne moduły, więc jeśli potrzebujesz tylko tej metody, możesz po prostu zainstalować ją bez reszty biblioteki:
źródło
Jeśli jesteś w stanie używać funkcji strzałek es6, możesz również zastosować częściowe podejście do aplikacji:
źródło
Jeśli nie chcesz definiować żadnej funkcji, napisanie jej w
Math.min(Math.max(x, a), b)
ten sposób nie jest takie złe.źródło
W duchu seksowności strzały możesz stworzyć mikro zacisk / ograniczenie / bramkę / i c. funkcja przy użyciu parametrów resztowych
Następnie podaj po prostu trzy wartości
To znaczy, znowu, jeśli mówiąc seksowny, masz na myśli „krótki”
źródło
clamp
, jeśli masz złożoną logikę (nawet jeśli jest „seksowna”), perf odniesie poważny sukcesTo rozszerza opcję trójskładnikową do if / else, która zminimalizowana jest równoważna opcji trójskładnikowej, ale nie powoduje utraty czytelności.
Zmniejsza do 35b (lub 43b, jeśli używasz
function
):Ponadto, w zależności od używanego narzędzia perf lub przeglądarki, można uzyskać różne wyniki, czy implementacja oparta na matematyce czy implementacja oparta na trzech elementach jest szybsza. W przypadku mniej więcej takiej samej wydajności wybrałbym czytelność.
źródło
Mój ulubiony:
źródło
[1,5,19].sort()[1]
zwraca 19. Można to naprawić w ten sposób:[min,x,max].sort(function(a, b) { return a - b; })[1]
ale to już nie jest seksowne. Oprócz tego, że jest intensywnie używany, może wystąpić problem z wydajnością, aby utworzyć nową tablicę tylko w celu porównania trzech liczb.[min, x, max].sort((a,b) => a-b)[1]