Javascript ile ters sırada bir dizide map () kullanmanın bir yolu var mı?


94

map()İşlevi bir javascript dizisinde kullanmak istiyorum , ancak ters sırada çalışmasını istiyorum.

Bunun nedeni, bir Meteor projesinde yığılmış React bileşenlerini işliyorum ve en üst düzey öğenin ilk olarak geri kalanı aşağıdaki görüntüleri yüklerken oluşturulmasını istiyorum.

var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.map(function (el, index, coll) {
    console.log(el + " ")
});

yazdırılıyor a b c d eama keşke bir map Reverse () olsaydıe d c b a

Herhangi bir öneri?


2
Neden reversedizide değilsin ?
John

2
Elemanları sıralamak için z-indeksini dizi indeksine göre ayarlıyorum. Sanırım z endeksini negatif olarak ayarlayabilirim.
Robin Newhouse

İyi bir fikir gibi görünüyor.
John

Bir yan not olarak, gerçekten mapdönen diziyi kullanıyor musunuz? Aksi takdirde, düşünmelisiniz forEach.
canon

1
Ters öğeye harita geri console.log(coll[coll.length - index - 1] + " ")
aramasında erişebilirsiniz

Yanıtlar:


147

Orijinal diziyi tersine çevirmek istemiyorsanız, onun basit bir kopyasını ve ardından ters çevrilmiş dizinin haritasını çıkartabilirsiniz.

myArray.slice(0).reverse().map(function(...

Z-endeksini belirtmek için sadece negatif dizini kullandım, ancak soruyu çerçeveleme biçimimde bu en doğru olanı.
Robin Newhouse

3
.Slice (0) 'a neden ihtiyacımız var? Neden myArray.slice (0) .reverse () yerine myArray.reverse () değil?
Yorumumun cevabım

Haradzieniec - Z-endeksi css özelliğini ayarlamak için orijinal sıralamaya ihtiyaç duyulduğu, ancak tersine basıldığı için, orijinal sorunun nasıl çerçevelendiğine dair ayrıntılarla birlikte gider.
AdamCooper86

slice(0)Olarak gerekli değildir reverse()yeni bir dizi dönüş ve mevcut dizi değiştirmez. @ AdamCooper86 Umarım bunu değiştirirsiniz.
Fahd Lihidheb

4
@FahdLihidheb reverse(), orijinal diziyi DEĞİŞTİRİR .
Ferus

20

Diziyi hiç değiştirmiyorum, işte bulduğum tek satırlık bir O (n) çözümü:

myArray.map((val, index, array) => array[array.length - 1 - index]);

valburada kullanılmıyor, bu yüzden OP'nin aradığı şeyin bu olduğunu sanmıyorum? (hala iyi bir çözüm)
Paul Razvan Berg

ayrıca, map () 'in 3. argümanı dizinin kendisidir
Knut

19

Kullanabilirsiniz 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)


noice (yine de bir azaltma gerçekleştirmek istiyorsanız) - MDN: lowerRight () yöntemi, onu tek bir değere düşürmek için bir toplayıcıya ve dizinin her bir değerine (sağdan sola) karşı bir işlev uygular.
TamusJRoyce

8

İsimli geri arama fonksiyonu ile

const items = [1, 2, 3]; 
const reversedItems = items.map(function iterateItems(item) {
  return item; // or any logic you want to perform
}).reverse();

Steno (adlandırılmış geri arama işlevi olmadan) - Ok Sözdizimi, ES6

const items = [1, 2, 3];
const reversedItems = items.map(item => item).reverse();

İşte sonuç

görüntü açıklamasını buraya girin


harita sığ bir kopya olarak kullanılıyor
TamusJRoyce

7

Başka bir çözüm şunlar olabilir:

const reverseArray = (arr) => arr.map((_, idx, arr) => arr[arr.length - 1 - idx ]);

Temelde dizi indeksleriyle çalışırsınız


2
Bu, gitmenin garip bir yolu gibi görünüyor, ancak öğeye ek olarak dizine erişmek istiyorsanız, indirgeme yaklaşımı da tuhaftır, gerçekten bir azaltma yapmak istemiyorum, vb. en temiz çözüm.
RealHandy

1
Harita içinde daha fazla çalışma yapmanız gerekiyorsa, arr [...] kullanmak ikinci bir kopya veya orijinal diziyi değiştirmeyi gerektirmez. 3. parametreyi unuttum. Ne arıyordum!
TamusJRoyce

6

MapReverse işlevini bir kez yazıp sonra kullanmayı tercih ederim. Ayrıca bunun diziyi kopyalamasına gerek yoktur.

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 ]

1
function mapRevers(reverse) {
    let reversed = reverse.map( (num,index,reverse) => reverse[(reverse.length-1)-index] );
    return reversed;
}

console.log(mapRevers(myArray));

I Diziyi Tersler'i eşlemek için iletirsiniz ve işlevde ters diziyi döndürürsünüz. Harita cb'de, indeks 10'dan (uzunluk) geçilen diziden 1'e kadar sayan değerleri alırsınız.


Bu kodun ne yaptığına dair yazılı bir açıklama yardımcı olabilir.
Pro Q

0

İşte hem O (n) hem de dizide iki kez çalıştırmayı önleyerek diğer çözümlerden daha verimli olan TypeScript çözümüm:

function reverseMap<T, O>(arg: T[], fn: (a: T) => O) {
   return arg.map((_, i, arr) => fn(arr[arr.length - i - 1]))
}

JavaScript'te:

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]))
}

-1

Önce myArray.reverse () işlemini yapabilirsiniz.

var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.reverse().map(function (el, index, coll) {
    console.log(el + " ")
});

Genel olarak bu benim çözümüm olabilir, ancak kurulumda kullandığım üst kart son indeksle birlikte yerleştirilir. Sanırım daha iyi bir indeksleme sorunu çözebilir.
Robin Newhouse

16
Bir not olarak, bu orijinal diziyi yerinde tersine çevirecek, yani dizinin sırasını yıkıcı bir şekilde değiştirecektir.
AdamCooper86

-2

Eski bir soru ama yeni izleyiciler için bu, haritayı kullanarak diziyi ters çevirmenin en iyi yoludur.

var myArray = ['a', 'b', 'c', 'd', 'e'];
[...myArray].map(() => myArray.pop());

bu orijinal diziyi değiştirir
TamusJRoyce

belki demek: [...myArray].map((_, _, arr) => arr.pop());?
Madeo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.