🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

Q&A

解決済

2回答

1885閲覧

JavaScriptによるJSON変数の並び替え(ランキング順)

退会済みユーザー

退会済みユーザー

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

1グッド

1クリップ

投稿2019/10/21 09:05

JSON変数をJavaScriptで扱うのが初めてで、どうしても分からないことがあったので質問させていただきました。

js

1const userData = { 2 "a": 23, 3 "b": 31, 4 "c": 4 5} 6var sortData; 7// (並び替え処理) 8console.log(sortData)

上のようなのスクリプトがあったとして、

console

11位 bさん 31p 22位 aさん 23p 33位 cさん 4p

のような結果を求めたいです。
// (並び替え処理) にはどういった処理を書けばいいのでしょうか?よろしくお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

こんにちは

一例としまして、以下のような感じかなと思います。

javascript

1const userData = { 2 "a": 23, 3 "b": 31, 4 "c": 4 5}; 6 7const sortData = Object.entries(userData) 8 .sort(([k1, v1],[k2, v2]) => v2 - v1) 9 .map(([k,v], i) => `${i+1}${k}さん ${v}p`); 10 11sortData.forEach(str => { console.log(str); }); 12

以下、上記で使っているメソッドの説明です。

以上、参考になれば幸いです。

投稿2019/10/21 09:35

jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2019/10/21 10:23

こちらも詳しい説明ありがとうございました。 私はまだ未熟者ですが、何とか学んでいけたらいいなと思います(^^;)
jun68ykt

2019/10/21 12:21

どういたしまして。 今回使ったメソッドを、いっぺんに覚えようとすると大変なので、頭に入りやすいものから一個ずつ確実にモノにしていかれるとよいかと思います。
guest

0

ベストアンサー

javascript

1const userData = { 2 "a": 23, 3 "b": 31, 4 "c": 4 5} 6//var res=Object.entries(userData).sort((x,y)=>-x[1]+y[1]).map((x,y)=>[y+1].concat(x)); 7var res=Object.entries(userData) 8 .sort((x,y)=>-x[1]+y[1]) 9 .map((x,y)=>[(y+1).toString()+"位",x[0]+"さん",x[1].toString()+"p"]); 10console.log(res);

一部調整しました。
上記ソースを3段階に分割すると以下

解説

javascript

1var res=Object.entries(userData); // [["a",23],["b",31],["c",4]]を抽出 2res=res.sort((x,y)=>-x[1]+y[1]); // ソートして[["b",31],["a",23],["c",4]]にする 3res=res.map((x,y)=>[(y+1).toString()+"位",x[0]+"さん",x[1].toString()+"p"]);//各要素に単位や敬称をつける

rankをオブジェクトにする

javascript

1const userData = { 2 "a": 23, 3 "b": 31, 4 "c": 4 5} 6const userRank = Object 7 .entries(userData) 8 .sort((x,y)=>-x[1]+y[1]) 9 .map((x,y)=>[x[0],y+1]) 10 .reduce((x,y)=>(x[y[0]]=y[1],x),{}); 11console.log(userRank);

同順あり

javascript

1const userData = { 2 "a": 23, 3 "b": 31, 4 "c": 4, 5 "d": 23, 6} 7const userRank = Object.entries(userData) 8 .map((x,y)=>[x[0],Object.entries(userData).filter(z=>z[1]>x[1]).length+1]) 9 .reduce((x,y)=>(x[y[0]]=y[1],x),{}); 10console.log(userRank);

配列から

やってることは対して変わりません
(一応同順あり版で)

javascript

1const userData = { 2"a": [0, 0, 0, 23, 0], 3"b": [0, 0, 0, 31, 0], 4"c": [0, 0, 0, 4, 0], 5"d": [0, 0, 0, 23, 0], 6} 7const userRank = Object.entries(userData) 8 .map((x,y)=>[x[0],Object.entries(userData).filter(z=>z[1][3]>x[1][3]).length+1]) 9 .reduce((x,y)=>(x[y[0]]=y[1],x),{}); 10console.log(userRank);

投稿2019/10/21 09:29

編集2019/10/25 09:21
yambejp

総合スコア116661

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

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

退会済みユーザー

退会済みユーザー

2019/10/21 09:36

ありがとうございます。もしよろしければ、そのスクリプトの意味を教えてくれますか?
yambejp

2019/10/21 09:45

解説つけておきました
退会済みユーザー

退会済みユーザー

2019/10/21 09:58

すいません。そのresをJSONとして結果を出したいのですがどうすればいいでしょうか? 何度も何度も質問して申し訳ございません。
yambejp

2019/10/21 10:01 編集

> resをJSONとして結果を出したい 具体的にどういったデータになっていればいいのでしょうか? console.log(JSON.stringify(res)); ではダメですか?
退会済みユーザー

退会済みユーザー

2019/10/21 10:05

{ "a": 2, "b": 1, "c": 3 } ↑のような感じです。ランキングの順位を求めたいです。すいません(^^;)
yambejp

2019/10/21 10:21

ランクをオブジェクトで返すsampleを上げておきました
退会済みユーザー

退会済みユーザー

2019/10/21 10:23

>>yambejp様 本当にありがとうございました。わがままな私を聞いてくれて...(^^;) 実行結果も正常でした。本当に本当にありがとうございました。
yambejp

2019/10/21 10:25

ちなみに同順位とか考慮していませんので必要があればまた 別途質問ください (1位、2位、2位、4位みたいなやつ)
退会済みユーザー

退会済みユーザー

2019/10/21 13:11

あ、じゃ可能であればできますかね?すいません(^^;)
yambejp

2019/10/25 05:13

回答忘れてました。 同順あり追記しときました
退会済みユーザー

退会済みユーザー

2019/10/25 08:33

本当にありがとうございます(^^;)
退会済みユーザー

退会済みユーザー

2019/10/25 08:55

すいません。友人がゲームデータの追加提案をして、JSONのランキングおよびその他データを配列変数で扱うことになってしまいました(^^;) const userData = { "a": [0, 0, 0, 23, 0], "b": [0, 0, 0, 31, 0], "c": [0, 0, 0, 4, 0], "d": [0, 0, 0, 22, 0], } 他のデータの詳細はプログラムとして分かりずらいので 0 とします。 この時、4番目([3])を基準にランキングをしたいのでyambejp様のスクリプトを一部編集(ただ単に[3]を追加しただけ)しましたが、私の理解度の無さから希望通りの結果には返りませんでした。 どうすればよろしいでしょうか。いい加減自分の力で解決したいので、本当に本当にこの質問で最後にします。申し訳ございませんm(__)m
yambejp

2019/10/25 09:21

「配列から」を追記しておきました
退会済みユーザー

退会済みユーザー

2019/10/25 11:01

本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問