Szukam metody wstawiania tablic JavaScript w stylu:
arr.insert(index, item)
Najlepiej w jQuery, ale w tym momencie zrobi to każda implementacja JavaScript.
javascript
jquery
arrays
tags2k
źródło
źródło
Odpowiedzi:
To, czego chcesz, to
splice
funkcja w natywnym obiekcie tablicowym.arr.splice(index, 0, item);
wstawiitem
sięarr
pod określonym indeksem (0
najpierw usuwając elementy, to znaczy, to tylko wstawka).W tym przykładzie utworzymy tablicę i dodamy do niej element do indeksu 2:
źródło
arr.splice(2,3)
usunie 3 elementy, zaczynając od indeksu 2. Bez przekazania 3. .... N-tych parametrów nic nie zostanie wstawione. Więc nazwainsert()
też nie oddaje sprawiedliwości.Możesz zaimplementować
Array.insert
metodę, wykonując następujące czynności:Następnie możesz użyć go w następujący sposób:
źródło
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
Inne niż połączenie, możesz użyć tego podejścia, które nie spowoduje mutacji oryginalnej tablicy, ale utworzy nową tablicę z dodanym elementem. Zazwyczaj należy unikać mutacji, gdy tylko jest to możliwe. Używam tutaj operatora rozprzestrzeniania ES6.
Można tego użyć, aby dodać więcej niż jeden element, nieco poprawiając funkcję, aby użyć operatora spoczynkowego dla nowych elementów i rozłożyć to również na zwracany wynik
źródło
Niestandardowe
insert
metody tablicowe1. Z wieloma argumentami i łańcuchem wsparcia
Może wstawiać wiele elementów (podobnie jak natywny
splice
) i obsługuje tworzenie łańcuchów:2. Z argumentami typu tablicowego łączącymi i łączącymi łańcuchy
Może łączyć tablice z argumentów z podaną tablicą, a także obsługuje łańcuch:
DEMO: http://jsfiddle.net/UPphH/
źródło
["b", "X", "Y", "Z", "c"]
. Dlaczego nie jest"d"
uwzględniony? Wydaje mi się, że jeśli wstawisz 6 jako drugi parametrslice()
i w tablicy jest 6 elementów zaczynających się od określonego indeksu, to powinieneś otrzymać wszystkie 6 elementów w wartości zwracanej. (Dokument mówihowMany
o tym parametrze.) Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=>[ ]
slice
metody, a niesplice
, o której mówisz w komentarzu. Drugi parametrslice
(o nazwieend
) to liczony od zera indeks, przy którym kończy się ekstrakcja.slice
wyciągi do, ale nie w tymend
. Stąd poinsert
masz["a", "b", "X", "Y", "Z", "c", "d"]
, z któregoslice
wyodrębnia się elementy z indeksami od1
do6
, tj. Od"b"
do,"d"
ale bez uwzględnienia"d"
. Czy ma sens?Jeśli chcesz wstawić wiele elementów do tablicy jednocześnie, sprawdź odpowiedź Przepełnienie stosu: Lepszy sposób na podzielenie tablicy na tablicę w javascript
Oto niektóre funkcje ilustrujące oba przykłady:
Nareszcie jest jsFiddle, więc możesz to zobaczyć na własne oczy: http://jsfiddle.net/luisperezphd/Wc8aS/
I w ten sposób korzystasz z funkcji:
źródło
Dla właściwego programowania funkcjonalnego i tworzenia łańcuchów
Array.prototype.insert()
niezbędny jest wynalazek . W rzeczywistości splot mógłby być idealny, gdyby zwrócił zmutowaną tablicę zamiast całkowicie pozbawionej znaczenia pustej tablicy. Więc proszęCóż, ok powyższe z tym
Array.prototype.splice()
mutuje oryginalną tablicę, a niektórzy mogą narzekać: „nie powinieneś modyfikować tego, co nie należy do ciebie”, co również może okazać się słuszne. Więc dla dobra publicznego chciałbym podać inny,Array.prototype.insert()
który nie mutuje oryginalnej tablicy. Oto jest;źródło
splice
mutujesz oryginalną tablicę, nie sądzę, aby „właściwe programowanie funkcjonalne” należało do dowolnego miejsca w pobliżusplice
.W tym przypadku zalecam użycie czystego JavaScript , nie ma też metody wstawiania w JavaScript, ale mamy metodę, która jest wbudowaną metodą Array , która wykonuje zadanie za Ciebie, nazywa się to splice ...
Zobaczmy, co jest splice () ...
OK, wyobraź sobie, że mamy tę tablicę poniżej:
Możemy usunąć w
3
następujący sposób:Zwróci 3, ale jeśli teraz sprawdzimy ARR, otrzymamy:
Jak dotąd tak dobrze, ale jak możemy dodać nowy element do tablicy za pomocą splice? Odłóżmy 3 do arr ...
Zobaczmy, co zrobiliśmy ...
Ponownie używamy splajnu , ale tym razem dla drugiego argumentu przekazujemy 0 , co oznacza, że nie chcemy usuwać żadnego elementu, ale jednocześnie dodajemy trzeci argument, czyli 3, który zostanie dodany przy drugim indeksie ...
Należy pamiętać, że możemy jednocześnie usuwać i dodawać , na przykład teraz możemy:
Co spowoduje usunięcie 2 elementów z indeksu 2, a następnie dodanie 3 z indeksu 2, a wynikiem będzie:
To pokazuje, jak działa każdy element w połączeniu:
źródło
Dołącz pojedynczy element do określonego indeksu
Dołącz wiele elementów do określonego indeksu
źródło
arrName[3] = 'newName1';
zostanie dołączona, jeśli tablica zawiera tylko 3 elementy. Jeśli w indeksie 3 znajduje się element, zostanie on zastąpiony. Jeśli chcesz dołączyć na końcu, lepiej użyćarrName.push('newName1');
Inne możliwe rozwiązanie z wykorzystaniem
Array#reduce
.źródło
Oto dwa sposoby:
LUB
źródło
Mimo że już na to odpowiedziano, dodaję tę notatkę dla alternatywnego podejścia.
Chciałem umieścić znany numer elementów w tablicy, w określonych pozycjach, ponieważ wychodzą one z „tablicy asocjacyjnej” (tj. Obiektu), który z definicji nie ma zagwarantowanej kolejności. Chciałem, aby wynikowa tablica była tablicą obiektów, ale obiekty powinny być w określonej kolejności w tablicy, ponieważ tablica gwarantuje ich kolejność. Więc to zrobiłem.
Najpierw obiekt źródłowy, ciąg JSONB pobrany z PostgreSQL. Chciałem, aby została posortowana według właściwości „order” w każdym obiekcie potomnym.
Ponieważ liczba węzłów w obiekcie jest znana, najpierw tworzę tablicę o określonej długości:
A następnie iteruj obiekt, umieszczając nowo utworzone obiekty tymczasowe w pożądanych lokalizacjach w tablicy, bez faktycznego „sortowania”.
źródło
Każdy, kto nadal ma problemy z tym i wypróbował wszystkie powyższe opcje i nigdy go nie otrzymał. Dzielę się moim rozwiązaniem, aby wziąć pod uwagę, że nie chcesz wyraźnie określać właściwości obiektu względem tablicy.
Jest to kombinacja iteracji tablicy referencyjnej i porównania jej z obiektem, który chciałbyś sprawdzić, przekonwertować oba z nich na ciąg, a następnie iterować, jeśli pasuje. Wtedy możesz po prostu liczyć. Można to poprawić, ale tam się osiedliłem. Mam nadzieję że to pomoże.
źródło
Biorąc zysk z metody redukcji w następujący sposób:
W ten sposób możemy zwrócić nową tablicę (będzie to fajny sposób funkcjonalny - znacznie lepszy niż użycie push lub splice) z elementem wstawionym w indeksie, a jeśli indeks jest większy niż długość tablicy, zostanie wstawiony na końcu.
źródło
Array#splice()
jest właściwą drogą, chyba że naprawdę chcesz uniknąć mutacji tablicy. Biorąc pod uwagę 2 tablicearr1
iarr2
, oto jak można wstawić zawartośćarr2
doarr1
po pierwszym elemencie:Jeśli obawiasz się o mutacji tablicę (na przykład w przypadku korzystania Immutable.js), można zamiast tego użyć
slice()
, nie należy mylić zsplice()
z'p'
.źródło
Próbowałem tego i działa dobrze!
Indeks to pozycja, w której chcesz wstawić lub usunąć element. 0 tzn. Drugie parametry definiują liczbę elementów z indeksu do usunięcia. Pozycjami są nowe wpisy, które chcesz wprowadzić w tablicy. Może to być jeden lub więcej niż jeden.
źródło
Oto działająca funkcja, której używam w jednej z moich aplikacji.
Sprawdza to, czy produkt wyjdzie
A potem nazywam to poniżej.
źródło
Trochę starszego wątku, ale muszę się zgodzić z Redu powyżej, ponieważ splice zdecydowanie ma nieco mylący interfejs. A odpowiedź udzielona przez cdbajorin, że „zwraca pustą tablicę tylko wtedy, gdy drugim parametrem jest 0. Jeśli jest większa niż 0, zwraca elementy usunięte z tablicy”, choć jest dokładna, potwierdza to. Funkcja ma na celu splatanie lub, jak powiedział wcześniej Jakob Keller, „łączyć się lub łączyć, a także zmieniać. Masz ustaloną tablicę, którą teraz zmieniasz, co wymagałoby dodawania lub usuwania elementów ...” Biorąc pod uwagę, że wartość zwracana elementów, które zostały usunięte, jest co najwyżej niewygodna. I w 100% zgadzam się, że ta metoda mogłaby być lepiej dostosowana do tworzenia łańcuchów, gdyby zwróciła coś, co wydaje się naturalne, nową tablicę z dodanymi połączonymi elementami. Następnie możesz robić rzeczy takie jak [„19”, „17”]. Splice (1,0, „18”). Łączyć („...”) lub cokolwiek zechcesz ze zwróconą tablicą. Fakt, że zwraca to, co zostało usunięte, jest po prostu nonsensem IMHO. Jeśli celem tej metody było „wycięcie zestawu elementów”, a może tylko taka była intencja. Wygląda na to, że jeśli nie wiem, co już wycinam, prawdopodobnie nie mam powodu, by wycinać te elementy, prawda? Byłoby lepiej, gdyby zachowywał się jak konkatacja, mapa, redukcja, plaster itp., Gdzie nowa tablica jest tworzona z istniejącej tablicy, zamiast mutować istniejącą tablicę. Wszystkie są zbywalne i jest to poważny problem. Raczej manipulowanie łańcuchem tablicowym jest dość powszechne. Wygląda na to, że język musi podążać w jednym lub drugim kierunku i starać się go trzymać w jak największym stopniu. JavaScript jest funkcjonalny i mniej deklaratywny, wydaje się po prostu dziwnym odstępstwem od normy.
źródło
Wydajność
Dzisiaj (2020.04.24) wykonuję testy dla wybranych rozwiązań dla dużych i małych macierzy. Testowałem je na MacOs High Sierra 10.13.6 na Chrome 81.0, Safari 13.1, Firefox 75.0.
Wnioski
Dla wszystkich przeglądarek
slice
ireduce
(D, E, F) są zwykle 10 x 100 razy szybsze niż rozwiązania na miejscusplice
(AI, BI, CI) były najszybsze (czasami ~ 100x - ale zależy to od rozmiaru tablicy)Detale
Testy podzielono na dwie grupy: rozwiązania na miejscu (AI, BI, CI) i rozwiązania na miejscu (D, E, F) i przeprowadzono je w dwóch przypadkach
Testowany kod jest przedstawiony poniżej
Pokaż fragment kodu
Przykładowe wyniki dla małej tablicy na chrome są poniżej
źródło