Chcę użyć tej map()
funkcji na tablicy javascript, ale chciałbym, aby działała w odwrotnej kolejności.
Powodem jest to, że renderuję skumulowane komponenty React w projekcie Meteor i chciałbym, aby element najwyższego poziomu był renderowany jako pierwszy, podczas gdy reszta ładuje obrazy poniżej.
var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.map(function (el, index, coll) {
console.log(el + " ")
});
drukuje, a b c d e
ale chciałbym, żeby była wydrukowana mapReverse ()e d c b a
Jakieś sugestie?
javascript
arrays
Robin Newhouse
źródło
źródło
reverse
tablicy?map
zwracanej tablicy ? W przeciwnym razie powinieneś rozważyćforEach
.console.log(coll[coll.length - index - 1] + " ")
Odpowiedzi:
Jeśli nie chcesz odwracać oryginalnej tablicy, możesz zrobić jej płytką kopię, a następnie zmapować odwróconą tablicę,
myArray.slice(0).reverse().map(function(...
źródło
slice(0)
jest potrzebny, ponieważreverse()
zwraca nową tablicę i nie modyfikuje bieżącej tablicy. @ AdamCooper86 Mam nadzieję, że to zmienisz.reverse()
NIE modyfikuje oryginalnej tablicy.W ogóle nie mutując tablicy, oto jedno liniowe rozwiązanie O (n), które wymyśliłem:
myArray.map((val, index, array) => array[array.length - 1 - index]);
źródło
val
nie jest tutaj używany, więc nie sądzę, aby tego szukał OP? (to wciąż dobre rozwiązanie)Możesz użyć
Array.prototype.reduceRight()
var myArray = ["a", "b", "c", "d", "e"]; var res = myArray.reduceRight(function (arr, last, index, coll) { console.log(last, index); return (arr = arr.concat(last)) }, []); console.log(res, myArray)
źródło
Z nazwaną funkcją zwrotną
const items = [1, 2, 3]; const reversedItems = items.map(function iterateItems(item) { return item; // or any logic you want to perform }).reverse();
Skrót (bez nazwanej funkcji zwrotnej) - składnia strzałki, ES6
const items = [1, 2, 3]; const reversedItems = items.map(item => item).reverse();
Oto wynik
źródło
Innym rozwiązaniem mogłoby być:
const reverseArray = (arr) => arr.map((_, idx, arr) => arr[arr.length - 1 - idx ]);
Zasadniczo pracujesz z indeksami tablic
źródło
Wolę raz napisać funkcję mapReverse, a następnie jej użyć. Nie ma też potrzeby kopiowania tablicy.
function mapReverse(array, fn) { return array.reduceRight(function (result, el) { result.push(fn(el)); return result; }, []); } console.log(mapReverse([1, 2, 3], function (i) { return i; })) // [ 3, 2, 1 ] console.log(mapReverse([1, 2, 3], function (i) { return i * 2; })) // [ 6, 4, 2 ]
źródło
function mapRevers(reverse) { let reversed = reverse.map( (num,index,reverse) => reverse[(reverse.length-1)-index] ); return reversed; } console.log(mapRevers(myArray));
I Przekazujesz tablicę, aby odwzorować Revers, aw funkcji zwracasz odwróconą tablicę. W mapie cb po prostu pobierasz wartości z indeksem liczącym od 10 (długość) do 1 z przekazanej tablicy
źródło
Oto moje rozwiązanie TypeScript, które jest zarówno O (n), jak i bardziej wydajne niż inne rozwiązania, zapobiegając dwukrotnemu uruchomieniu przez tablicę:
function reverseMap<T, O>(arg: T[], fn: (a: T) => O) { return arg.map((_, i, arr) => fn(arr[arr.length - i - 1])) }
W JavaScript:
const reverseMap = (arg, fn) => arg.map((_, i, arr) => fn(arr[arr.length - 1 - i])) // Or function reverseMap(arg, fn) { return arg.map((_, i, arr) => fn(arr[arr.length - i - 1])) }
źródło
Możesz najpierw wykonać myArray.reverse ().
var myArray = ['a', 'b', 'c', 'd', 'e']; myArray.reverse().map(function (el, index, coll) { console.log(el + " ") });
źródło
Stare pytanie, ale dla nowych widzów jest to najlepszy sposób na odwrócenie tablicy za pomocą mapy
var myArray = ['a', 'b', 'c', 'd', 'e']; [...myArray].map(() => myArray.pop());
źródło
[...myArray].map((_, _, arr) => arr.pop());
:?