przykład:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
Tablica nadal ma swoje oryginalne wartości, czy jest jakiś sposób na dostęp do zapisu elementów tablicy z funkcji iteracji?
przykład:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
Tablica nadal ma swoje oryginalne wartości, czy jest jakiś sposób na dostęp do zapisu elementów tablicy z funkcji iteracji?
x=[2,3,4]; x=x.map(n=>n*2); // [4,6,8]
Odpowiedzi:
Oddzwonienie jest przekazywane element, indeks i samą tablicę.
edycja - jak zauważono w komentarzu,
.forEach()
funkcja może przyjąć drugi argument, który będzie użyty jako wartośćthis
w każdym wywołaniu wywołania zwrotnego:Ten drugi przykład pokazuje
arr
, że konfiguruje się jakthis
w wywołaniu zwrotnym. Można by pomyśleć, że tablica zaangażowana w.forEach()
wywołanie może być wartością domyślnąthis
, ale z jakiegokolwiek powodu tak nie jest;this
będzie,undefined
jeśli ten drugi argument nie zostanie podany.(Uwaga: powyższe informacje
this
nie mają zastosowania, jeśli wywołanie zwrotne jest=>
funkcją, ponieważthis
nigdy nie jest związane z niczym, gdy takie funkcje są wywoływane).Ważne jest również, aby pamiętać, że na prototypie Array dostępna jest cała rodzina podobnych narzędzi, a na Stackoverflow pojawia się wiele pytań dotyczących jednej lub drugiej funkcji, tak aby najlepszym rozwiązaniem było wybranie innego narzędzia. Masz:
forEach
za robienie rzeczy z lub do każdego wpisu w tablicy;filter
do tworzenia nowej tablicy zawierającej tylko kwalifikujące się wpisy;map
do tworzenia nowej tablicy jeden do jednego poprzez transformację istniejącej tablicy;some
aby sprawdzić, czy co najmniej jeden element w tablicy pasuje do jakiegoś opisu;every
aby sprawdzić, czy wszystkie wpisy w tablicy pasują do opisu;find
szukać wartości w tablicyi tak dalej. Link MDN
źródło
part
(a naweto
w es6) jest niezdefiniowany? jak uzyskać iterowaną wartość?part
byłoby,undefined
gdyby element tablicy zostałundefined
jawnie przypisany . „Puste” pola tablicy (pozycja tablicy, której nigdy nie przypisano żadnej wartości) są pomijane przez.forEach()
większość innych metod iteracji tablicy..forEach()
bierze również drugi argumentthisArg
, którego można użyć jakothis
wewnątrz wywołania zwrotnego. UWAGA: jest to argument.forEach
NIE będący argumentem wywołania zwrotnego.this
przekazanego jako drugiego argumentu do.forEach()
, musisz przekazać funkcję wywołania zwrotnego za pomocą składnifunction()
, ponieważ użycie funkcji strzałki ES6() => {}
nie wiąże kontekstu.Załóżmy, spróbuj zachować to proste i dyskutować, jak to rzeczywiście działa. Ma to związek z typami zmiennych i parametrami funkcji.
Oto twój kod, o którym mówimy:
Po pierwsze, tutaj powinieneś przeczytać o Array.prototype.forEach ():
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Po drugie, pomówmy krótko o typach wartości w JavaScript.
Prymitywy (niezdefiniowane, null, String, Boolean, Number) przechowują rzeczywistą wartość.
dawny:
var x = 5;
Typy referencyjne (obiekty niestandardowe) przechowują lokalizację pamięci obiektu.
dawny:
var xObj = { x : 5 };
I po trzecie, jak działają parametry funkcji.
W funkcjach parametry są zawsze przekazywane przez wartość.
Ponieważ
arr
jest tablicą ciągów, jest to tablica prymitywnych obiektów, co oznacza, że są one przechowywane według wartości.Tak więc dla powyższego kodu oznacza to, że za każdym razem iteracja forEach ()
part
jest równa tej samej wartości coarr[index]
, ale nie ten sam obiekt .part = "four";
zmienipart
zmienną, ale pozostawi warr
spokoju.Poniższy kod zmieni pożądane wartości:
Teraz, jeśli tablica
arr
była tablicą typów referencji , poniższy kod będzie działał, ponieważ typy referencji przechowują lokalizację pamięci obiektu zamiast rzeczywistego obiektu.Poniżej pokazano, że możesz zmienić,
part
aby wskazywać nowy obiekt, pozostawiając obiekty przechowywanearr
same:źródło
In functions, parameters are always passed by value.
co z drugim przykładem?Tablica:
[1, 2, 3, 4]
Wynik:
["foo1", "foo2", "foo3", "foo4"]
Array.prototype.map()
Zachowaj oryginalny układArray.prototype.forEach()
Zastąp oryginalną tablicęźródło
let arr1 = ["1", 2, 3, 4]; arr1.map(function(v) { return "foo"+ v; }); console.log( arr );
Array.prototype.map () Nigdy nie modyfikuj oryginalnej tablicy, forEach mutate.map
zdecydowanie może mutować swoją tablicę iforEach
generalnie nie.JavaScript jest przechodzi przez wartość, i która w istocie oznacza
part
to kopię wartości w tablicy.Aby zmienić wartość, uzyskaj dostęp do samej tablicy w swojej pętli.
arr[index] = 'new value';
źródło
part
czy jest kopiowane - chociaż masz rację, że zmienna nie jest wskaźnikiem, ale wartościązamień go na indeks tablicy.
źródło
Oto podobna odpowiedź przy użyciu
=>
funkcji stylu:daje wynik:
Ten
self
parametr nie jest konieczny w przypadku funkcji stylu strzałki, więcdziała również.
źródło
Funkcja .forEach może mieć funkcję zwrotną (eachelement, elementIndex) Zasadniczo więc musisz:
Lub jeśli chcesz zachować oryginalną tablicę, możesz wykonać jej kopię przed wykonaniem powyższego procesu. Aby wykonać kopię, możesz użyć:
źródło
map()
zamiastforEach()
.map()
iteruje tablicę źródłową i zwraca nową tablicę zawierającą [zmodyfikowaną] kopię oryginału: tablica źródłowa pozostaje niezmieniona.Metodami obiektowymi Array można modyfikować zawartość Array, ale w porównaniu z podstawowymi pętlami for, metody te nie mają jednej ważnej funkcji. Nie można modyfikować indeksu w biegu.
Na przykład, jeśli usuniesz bieżący element i umieścisz go w innej pozycji indeksu w tej samej tablicy, możesz to łatwo zrobić. Jeśli przeniesiesz bieżący element do poprzedniej pozycji, w następnej iteracji nie będzie problemu, otrzymasz ten sam następny element, jakbyś nic nie zrobił.
Rozważ ten kod, w którym przesuwamy element z pozycji indeksu 5 do pozycji indeksu 2, gdy indeks policzy do 5.
Jeśli jednak przeniesiemy bieżący element do miejsca poza bieżącą pozycją indeksu, sytuacja stanie się nieco nieuporządkowana. Następnie następny element przesunie się do pozycji przeniesionych elementów, a podczas następnej iteracji nie będziemy w stanie go zobaczyć ani ocenić.
Rozważ ten kod, w którym przesuwamy element z pozycji indeksu 5 do pozycji indeksu 7, gdy indeks policzy do 5.
Więc nigdy nie spotkaliśmy 6 w pętli. Zwykle w pętli for oczekuje się zmniejszenia wartości indeksu podczas przesuwania elementu tablicy do przodu, tak aby indeks pozostał na tej samej pozycji w następnym uruchomieniu i nadal można ocenić element przesunięty na miejsce usuniętego elementu. Nie jest to możliwe w przypadku metod tablicowych. Nie możesz zmienić indeksu. Sprawdź następujący kod
Jak widać, kiedy zmniejszamy,
i
nie będzie kontynuowane od 5, ale od 6, od miejsca, w którym zostało.Miej to na uwadze.
źródło
Aby całkowicie dodać lub usunąć elementy, które zmieniłyby indeks, poprzez rozszerzenie sugestii funkcji zhujy_8833 funkcji slice () w celu iteracji po kopii, wystarczy policzyć liczbę elementów, które zostały już usunięte lub dodane i odpowiednio zmodyfikować indeks. Na przykład, aby usunąć elementy:
Aby wstawić elementy wcześniej:
Aby wstawić elementy po:
Aby zastąpić element:
Uwaga: jeśli implementuje się zarówno wstawki „przed”, jak i „po”, kod powinien obsługiwać najpierw wstawki „przed”, w przeciwnym razie nie byłoby to zgodne z oczekiwaniami
źródło
Możesz spróbować, jeśli chcesz zastąpić
źródło