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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
- **動作確認用CodePen: ** https://codepen.io/jun68ykt/pen/eYYBqEv?editors=0012
以下、上記で使っているメソッドの説明です。
- MDN: Object.entries
- MDN: Array.prototype.sort()
- MDN: Array.prototype.map()
- MDN: Array.prototype.forEach()
以上、参考になれば幸いです。
投稿2019/10/21 09:35
総合スコア9058
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総合スコア116661
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/21 09:45
退会済みユーザー
2019/10/21 09:58
2019/10/21 10:01 編集
退会済みユーザー
2019/10/21 10:05
2019/10/21 10:21
退会済みユーザー
2019/10/21 10:23
2019/10/21 10:25
退会済みユーザー
2019/10/21 13:11
2019/10/25 05:13
退会済みユーザー
2019/10/25 08:33
退会済みユーザー
2019/10/25 08:55
2019/10/25 09:21
退会済みユーザー
2019/10/25 11:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/21 10:23
2019/10/21 12:21