質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

712閲覧

Javascript Mapオブジェクトの各値のindexを知りたい

yochun02

総合スコア76

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/12/06 13:42

編集2021/12/06 13:48

Mapオブジェクトをソートして、その順番を処理に使いたいのですが、ループ内でindexを取る方法が思いつきません。
以下の様に、初めa(order=2), b(order=3), c(order=1)に設定されていたものをa(order=1), b(order=2), c(order=3)と変えたいのですがどのようにすればよいでしょうか?
→ 初めの並びを変更するようなアルゴリズムを作るのが目的です。
Mapを用いれば(キーがあるので順番の変更を追尾できる)できるかと思ったんですが、もしかしたら別のアプローチがあればその方法もご教授願いたく。

javascript

1 2const map = new Map(); 3map.set("c", {order: 1}); 4map.set("a", {order: 2}); 5map.set("b", {order: 3}); 6 7// before sort 8Map (3) { 9 "c" => {"order": 1}, 10 "a" => {"order": 2}, 11 "b" => {"order": 3} 12} 13 14const sort = new Map([...map].sort((a,b) => a[0] > b[0])); // 名前順によってソート 15 16// 17sort.foreach(...???) 18 19// 期待値 20// after sort 21Map (3) { 22 "a" => {"order": 1}, 23 "b" => {"order": 2}, 24 "c" => {"order": 3} 25} 26 27
愚直?な方法

javascript

1 2let idx = 0; 3for(const [key, obj] of sortMap) { 4 obj.order = idx; 5 idx ++; 6}; 7

ですが、より良い方法はありますかね?(Mapを使わずともシンプルな代替案があれば)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/12/06 13:59

> 以下の様に、初めa(order=2), b(order=3), c(order=1)に設定されていたものをa(order=1), b(order=2), c(order=3)と変えたいのですがどのようにすればよいでしょうか? えっと、キーと値の対応はバラバラにして大丈夫なのですか?
yochun02

2021/12/06 15:09 編集

キーの順番をそのMapオブジェクトの値に入れるというイメージです。 orderプロパティを持つa, b, cというオブジェクトがあり、(例えば初期値はそれぞれ[a,b,c] = [2,3,1]: .orderは省略)並び替えた後にそのオブジェクトのorderが並び替え後のインデックスの値([a,b,c] = [1,2,3])になっていてほしいということです。(0始まりでもよい)
guest

回答2

0

ベストアンサー

質問に書いてあることそのままをやろうとすると、こうですかね〜?

javascript

1const sortedEntries = [...map].sort(([k1], [k2]) => k1.localeCompare(k2)).map(([k], i) => [k, { order: i+1 }]); 2map.clear(); 3sortedEntries.forEach(kv => map.set(...kv));

???? サンプル

もしくは、

(Mapを使わずともシンプルな代替案があれば)

とのことなので、以下の2行

javascript

1map.clear(); 2sortedEntries.forEach(kv => map.set(...kv));

は不要で、sortedEntries がyochun02さんの望んでいるものかもしれません。

投稿2021/12/06 14:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yochun02

2021/12/06 15:38

map でいけたんですね。([key], iの使い方忘れていた。。)ありがとうございました!
guest

0

そもそも論として、Mapはキーと対応するを入れるための構造です。

キーと値を対応付けさせるのではなく、順番のほうが重要というのであれば、ただの配列を使ったほうが妥当なのではないでしょうか。

投稿2021/12/06 14:18

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yochun02

2021/12/06 15:39

順番も重要で、キーによって値(その順)をひもづけたかったのです。 確かに配列だけでもできそうなので考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問