javascriptで逆の順序で配列にmap()を使用する方法はありますか?


94

map()javascript配列で関数を使用したいのですが、逆の順序で操作したいと思います。

その理由は、MeteorプロジェクトでスタックされたReactコンポーネントをレンダリングしていて、トップレベルの要素を最初にレンダリングし、残りが下の画像をロードするようにしたいからです。

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

印刷しますa b c d eが、印刷されたmapReverse()があればいいのにと思いますe d c b a

助言がありますか?


2
reverseアレイを作ってみませんか?
ジョン

2
要素を並べ替えるために、配列インデックスでzインデックスを設定します。z-indexを負に設定できると思います。
ロビンニューハウス2016

いい考えのようですね。
ジョン

ちなみに、実際にmap返される配列を使用していますか?それ以外の場合は、を検討する必要がありますforEach
キヤノン

1
あなたは、マップのコールバックの中に逆の要素にアクセスすることができます:console.log(coll[coll.length - index - 1] + " ")
le_m

回答:


147

元の配列を逆にしたくない場合は、その浅いコピーを作成してから、逆にした配列のマップを作成できます。

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

結局、負のインデックスを使用してzインデックスを指定することになりましたが、質問を組み立てる方法では、これが最も正しいです。
ロビンニューハウス2016

3
なぜ.slice(0)が必要なのですか?myArray.slice(0).reverse()の代わりにmyArray.reverse()を使用しないのはなぜですか?私のコメントのための答えのように見えるがここにある:stackoverflow.com/questions/5024085/...
Haradzieniec

Haradzieniec-Z-index cssプロパティを設定するために元の順序が必要でしたが、逆に印刷されるという点で、元の質問がどのように組み立てられたかの詳細に一致します。
AdamCooper86 2017年

slice(0)必要されていないreverse()新しい配列を返し、現在の配列を変更しません。@ AdamCooper86私はあなたがそれを変えることを望みます。
ファハドリヒデブ

4
@FahdLihidhebreverse()は元の配列を変更します。
フェルス

20

配列をまったく変更していません。これが私が思いついたワンライナーO(n)ソリューションです。

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

valここでは使用されていないので、これがOPが探していたものではないと思いますか?(それでも良い解決策です)
Paul RazvanBerg19年

さらに、map()の3番目の引数は配列自体です
Knut

19

使用できます 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(とにかくreduceを実行しようとしている場合)-MDN:reduceRight()メソッドは、アキュムレータと配列の各値(右から左)に対して関数を適用して、単一の値に減らします。
TamusJRoyce

8

名前付きコールバック関数付き

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

省略形(名前付きコールバック関数なし)-矢印構文、ES6

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

これが結果です

ここに画像の説明を入力してください


マップは浅いコピーとして使用されています
TamusJRoyce

7

別の解決策は次のとおりです。

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

基本的に配列インデックスを操作します


2
これは奇妙な方法のように思えますが、要素に加えてインデックスにアクセスしたい場合、実際にreduceを実行したくない場合など、reduceRightアプローチも奇妙です。私の場合、これは最もクリーンなソリューション。
RealHandy 2018年

1
マップ内でさらに作業を行う必要がある場合は、arr [...]を使用しても、2番目のコピーや元の配列の操作は必要ありません。3番目のパラメーターを忘れました。私が探していたもの!
TamusJRoyce

6

mapReverse関数を一度記述してから使用することを好みます。また、これは配列をコピーする必要はありません。

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逆配列をマップするために配列を渡し、関数で逆配列を返します。マップcbでは、渡された配列からインデックスが10(長さ)から1までカウントされる値を取得するだけです。


このコードが何をしているのかについての書面による説明が役立つかもしれません。
プロQ

0

これは、O(n)であり、配列を2回実行しないようにすることで、他のソリューションよりも効率的なTypeScriptソリューションです。

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

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

-1

最初にmyArray.reverse()を実行できます。

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

それが一般的な私の解決策ですが、私が使用しているセットアップでは、一番上のカードが最後のインデックスで配置されます。いくつかのより良い索引付けで問題を解決できると思います。
ロビンニューハウス2016

16
注意点として、これにより元の配列が元の位置に反転します。つまり、配列の順序が破壊的に変更されます。
AdamCooper86 2016

-2

古い質問ですが、新しい視聴者にとっては、これがマップを使用して配列を逆にする最良の方法です

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

これにより、元のアレイが変更されます
TamusJRoyce

多分あなたが意味した:[...myArray].map((_, _, arr) => arr.pop());
マデオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.