W Pythonie, gdzie [2]
jest lista, następujący kod daje ten wynik:
[2] * 5 # Outputs: [2,2,2,2,2]
Czy istnieje prosty sposób na zrobienie tego za pomocą tablicy w JavaScript?
Napisałem następującą funkcję, aby to zrobić, ale czy jest coś krótszego czy lepszego?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
javascript
arrays
repeat
Curious2learn
źródło
źródło
Odpowiedzi:
Możesz to zrobić w następujący sposób:
Podwaja tablicę w każdej iteracji, dzięki czemu może stworzyć naprawdę dużą tablicę z kilkoma iteracjami.
Uwaga: Możesz również znacznie poprawić swoją funkcję, używając
push
zamiastconcat
, ponieważconcat
utworzy nową tablicę z każdą iteracją. W ten sposób (pokazany jako przykład pracy z tablicami):źródło
arr = new Array(len);
, a następnie przypisać je według indeksu w pętli, tjarr[i] = value;
. W ten sposób płacisz tylko O (n) zamiast konieczności ponownego przydzielania tablicy w miarę jej wzrostu. Zasadniczo zawsze lepiej jest unikać rozwijania tablic, dodając, jeśli to możliwe. Jeśli znasz ostateczny rozmiar, użyj go.Array.from({length:5}).map(x => 2)
W ES6 użyciem macierzy wypełnienia () Sposób
źródło
Array(5).fill([1,2,3]).flat()
. Zauważ, że flat () jest nadal bardzo eksperymentalny, a obsługa przeglądarki słaba.fill
jest oceniany raz, więcArray(9).fill(someMutable)
tworzy dziewięć odwołańsomeMutable
w tablicy (mutacja jednego powoduje mutację „wszystkich”).źródło
Array(...Array(10)).map(() => 5)
operatora rozsiewania lubArray.from(Array(10)).map(() => 5)
Array.from({length: 10}, () => 5);
lenght = 10
bez żadnych wyliczalnych właściwości..map
działa tylko w przypadku wyliczalnych właściwości..apply
Sposób przy tej tablicy i mapuje w produktarguments array
(obiektu tablicy podobne), które mają być przekazane doArray
funkcji konstruktora. Tablica argumentów nie może być rzadka, więc brakujące właściwości są ustawianeundefined
i stają się wyliczalne. Teraz możemy używać.map
zgodnie z przeznaczeniemmożesz spróbować:
Aktualizacja (01.06.2018) :
Teraz możesz mieć zestaw znaków powtarzających się.
Uwaga: Sprawdź więcej informacji o fill (...) i from (...) w celu uzyskania zgodności i obsługi przeglądarki.
Aktualizacja (05.11.2019) :
Innym sposobem, bez użycia
fill
lubfrom
, który działa dla ciągów dowolnej długości:źródło
Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]
lub utwórz tablicę o rosnącej wartości
Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]
źródło
Array.from({length:5}, i => 1)
=>i
jest,undefined
ponieważ reprezentuje pustą wartośćArray.from({length:5}, (e, i)=>i)
=>e
jest,undefined
ponieważ reprezentuje pustą wartość. Powinno byćArray.from({length:5}, v => 1)
iArray.from({length:5}, (v, i)=>i)
W lodash nie jest tak źle:
EDYCJA : Jeszcze lepiej:
EDYCJA : Jeszcze lepiej:
źródło
[c] * n
można zapisać jako:więc dla
[2] * 5
źródło
Możesz także rozszerzyć funkcjonalność Array w taki sposób:
Należy zauważyć, że rozszerzenie funkcjonalności wbudowanych obiektów może powodować problemy, jeśli pracujesz z bibliotekami innych firm. Zawsze rozważ to przy podejmowaniu decyzji.
źródło
fill
każdego indeksu w tablicy, będzie on odnosił się do tego samego obiektu, więc zmiana jednego zmieni wszystkie. Nie jest to zbyt trudne do rozwiązania, jeśli stanie się problemem.if (!Array.prototype.fill) { }
W REPL Node.js:
źródło
Array.from({length: 5}, x => 2);
ref. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.fromW przypadku, gdy trzeba powtórzyć tablicę kilka razy:
zainspirowany tą odpowiedzią
źródło
Nie ma łatwiejszego sposobu. Musisz utworzyć pętlę i wcisnąć elementy do tablicy.
źródło
push
lepszy czyconcat
lepszy pod względem wydajności?Użyj tej funkcji:
Lub dla bardziej kompaktowej wersji:
Lub dla wersji curry:
Możesz użyć tej funkcji z listą:
źródło
Jeśli chcesz powtórzyć tablicę, skorzystaj z poniższych.
wróci
źródło
Kolejna linijka:
źródło
Ta funkcja tworzy tablicę elementów (długość), w których każdy element jest równy (wartość), o ile (wartość) jest liczbą całkowitą lub ciągiem liczby całkowitej. Wszelkie liczby dziesiętne zostaną obcięte. Jeśli chcesz liczb dziesiętnych, zamień „parseInt ( ” na „ parseFloat ( ”
Przykłady:
źródło
Miałem problemy ze wspomnianymi metodami, kiedy korzystałem z tablicy podobnej do
Aby to uzyskać, używam:
źródło
cycle
.Odkryłem to dzisiaj, próbując stworzyć tablicę 2D bez użycia pętli. Patrząc wstecz, dołączenie do nowej tablicy jest miłe; Próbowałem zmapować nową tablicę, która nie działa, ponieważ mapa pomija puste miejsca.
Znak „#” może być dowolnym prawidłowym pojedynczym znakiem. Liczba 5 byłaby zmienną dla liczby wymaganych elementów. 7 będzie wartością, którą chcesz wypełnić tablicę.
Nowa metoda wypełniania jest lepsza, a kiedy ją kodowałem, nie wiedziałem, że istnieje, ani nie wiedziałem, że powtórzenie to es6; Zamierzam napisać wpis na blogu o używaniu tej sztuczki w tandemie z redukcją do robienia fajnych rzeczy.
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
źródło
Spróbuj tego:
źródło
źródło
Jeśli używasz paska narzędziowego, takiego jak lodash / podkreślenie, możesz to zrobić w ten sposób :)
źródło
Może być również stosowany jako jedna linijka:
źródło
Poprawiając odpowiedź Viveka , działa to na ciągi dowolnej długości, aby wypełnić tablicę o długości n:
Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)
źródło
Potrzebowałem sposobu na powtórzenie / zapętlenie tablicy (z n elementów) m razy.
Na przykład dystrybucja listy (osób) do tygodnia / miesiąca. Powiedzmy, że mam 3 nazwiska i chcę, aby powtórzyły się za tydzień:
źródło