Tak więc moje pytanie zostało zadane przez kogoś innego w jego formie Java : Java - Utwórz nową instancję String o określonej długości i wypełnioną określonym znakiem. Najlepsze rozwiązanie?
. . . ale szukam jego odpowiednika w JavaScript.
Zasadniczo chcę dynamicznie wypełniać pola tekstowe znakami „#” na podstawie atrybutu „maxlength” każdego pola. Tak więc, jeśli wejście ma maxlength="3"
, to pole zostanie wypełnione „###”.
Idealnie byłoby coś takiego jak Java StringUtils.repeat("#", 10);
, ale jak dotąd najlepszą opcją, jaką przychodzi mi do głowy, jest zapętlanie i dodawanie znaków „#”, jeden po drugim, aż do osiągnięcia maksymalnej długości. Nie mogę pozbyć się wrażenia, że jest na to skuteczniejszy sposób niż to.
Jakieś pomysły?
Do Twojej wiadomości - nie mogę po prostu ustawić wartości domyślnej w danych wejściowych, ponieważ znaki „#” muszą zostać wyczyszczone przy fokusie, a jeśli użytkownik nie wprowadził wartości, będą musiały zostać „uzupełnione” przy rozmyciu. Martwię się o krok „uzupełnienia”
źródło
Odpowiedzi:
Najlepszym sposobem na to (jaki widziałem) jest
To tworzy tablicę o określonej długości, a następnie łączy ją z podanym ciągiem do powtórzenia.
.join()
Funkcja wyróżnieniem długości tablicy, niezależnie od tego, czy elementy mieć przypisane wartości, zaś wartości nieokreślone są prezentowane jako puste.Musisz dodać 1 do żądanej długości, ponieważ ciąg separatora znajduje się między elementami tablicy.
źródło
parseInt()
wartości maxlength danych wejściowych przed użyciem jej do rozmiaru tablicy. Właśnie tego szukałem. . . dzięki!repeat
funkcja wbudowana w String.prototype teraz to obsługuje (ES6 +)Spróbuj: P
źródło
_.repeat('*',10);
repeat()
metody. Z niecierpliwością czekam na dzień, w którym nie będę już musiał się nimi przejmować. . .Niestety, chociaż wspomniane tutaj podejście Array.join jest zwięzłe, jest około 10 razy wolniejsze niż implementacja oparta na konkatenacji ciągów. Szczególnie słabo radzi sobie na dużych strunach. Zobacz poniżej pełne szczegóły dotyczące wydajności.
W przeglądarkach Firefox, Chrome, Node.js MacOS, Node.js Ubuntu i Safari najszybsza implementacja, którą przetestowałem, to:
To jest rozwlekłe, więc jeśli chcesz zwięzłej implementacji, możesz wybrać naiwne podejście; nadal działa od 2X do 10X lepiej niż podejście Array.join, a także jest szybszy niż implementacja podwajania dla małych danych wejściowych. Kod:
Dalsza informacja:
źródło
Utworzyłbym ciąg stały, a następnie wywołałbym na nim podciąg.
Coś jak
Nieco szybciej też.
http://jsperf.com/const-vs-join
źródło
ES2015 najłatwiej jest zrobić coś takiego
'X'.repeat(data.length)
X
będący dowolnym ciągiem,data.length
będący pożądaną długością.patrz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
źródło
Świetną opcją w ES6 byłby
padStart
pusty łańcuch. Lubię to:Uwaga: to nie zadziała w IE (bez polyfill).
źródło
s = '#'.repeat(10)
zamiast drugiego ( ) z odpowiedzi @ user4227915 powyżej?Wersja działająca we wszystkich przeglądarkach
Ta funkcja robi to, co chcesz i działa znacznie szybciej niż opcja sugerowana w zaakceptowanej odpowiedzi:
Używasz tego w ten sposób:
Aby porównać wydajność tej funkcji z opcją zaproponowaną w zaakceptowanej odpowiedzi, zobacz testy porównawcze tego Fiddle'a i tego Fiddle'a .
Wersja tylko dla nowoczesnych przeglądarek
W nowoczesnych przeglądarkach możesz teraz również to zrobić:
Ta opcja jest jeszcze szybsza. Jednak niestety nie działa w żadnej wersji przeglądarki Internet Explorer.
Liczby w tabeli określają pierwszą wersję przeglądarki, która w pełni obsługuje tę metodę:
źródło
W starszych przeglądarkach możesz także dodać wypełnienie tekstowe dla opcji Powtórz
źródło
Na podstawie odpowiedzi Hogana i Zero Trick Pony. Myślę, że powinno to być zarówno szybkie, jak i wystarczająco elastyczne, aby dobrze obsłużyć większość przypadków użycia:
źródło
Możesz użyć pierwszej linii funkcji jako linijki, jeśli chcesz:
źródło