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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

2回答

877閲覧

node.jsでオブジェクトのソート時、10以上の数値が1と2の間に来てしまう

Izumo1101

総合スコア49

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2020/09/15 00:49

条件に沿ってjsonデータベースから項目を抽出しています。
項目laneでソートをかけるとき、項目が9個以内であれば問題ありませんが10を超えると正常にソートされません。
例:13個の項目時
1
10
11
12
13
2
3
4
5

javascript

1//オブジェクトソートの関数 2 function object_array_sort(data,key,order,fn){ 3 //デフォは降順(DESC) 4 var num_a = -1; 5 var num_b = 1; 6 7 if(order === 'asc'){ 8 num_a = 1; 9 num_b = -1; 10 } 11 data = data.sort(function(a, b){ 12 var x = a[key]; 13 var y = b[key]; 14 if (x > y) return num_a; 15 if (x < y) return num_b; 16 return 0; 17 }); 18 fn(data); 19 } 20 21//以下クライアントにemitする記述 22 object_array_sort(new_data, 'lane', 'desc', function(new_data){ 23 for (i in new_data) { 24 item = new_data[i]; 25 compe = item.compe; 26 child = item.name; 27 sex = item.sex; 28 school = item.school; 29 grade = item.grade; 30 child2 = item.name2; 31 record = item.r0; 32 set = item.set; 33 lane = item.lane; 34 35 if(compe==socket.userName && set==Set){ 36 var socketID = socket.id ; 37 io.to(socketID).emit('message2',compe,child,sex,school,grade,child2,record,set,lane); 38 } 39 } 40 });

json

1{ 2 "items": [ 3 { 4 "grade": "6", 5 "sex": "男", 6 "name": "鈴木大地", 7 "name2": "スズキダイチ", 8 "compe": "6年男800m走", 9 "else": "2", 10 "school": "中国", 11 "set": "2", 12 "lane": "5", 13 "r0": "178", 14 "r1": "未入力", 15 "r2": "未入力", 16 "r3": "未入力", 17 "r4": "未入力", 18 "r5": "未入力", 19 "r6": "未入力", 20 "r7": "未入力", 21 "r8": "未入力", 22 "r9": "未入力", 23 "r10": "未入力", 24 "r11": "未入力", 25 "r12": "未入力", 26 "r13": "未入力", 27 "r14": "未入力", 28 "r15": "未入力", 29 "r16": "未入力", 30 "r17": "未入力", 31 "r18": "未入力", 32 "r19": "未入力", 33 "r20": "未入力" 34 }, 35 { 36 "grade": "6", 37 "sex": "男", 38 "name": "山田太郎", 39 "name2": "ヤマダタロウ", 40 "compe": "6年男走り高跳び", 41 "else": "2", 42 "school": "日本", 43 "set": "1", 44 "lane": "26", 45 "r0": "1.2", 46 "r1": "未入力", 47 "r2": "未入力", 48 "r3": "未入力", 49 "r4": "未入力", 50 "r5": "未入力", 51 "r6": "未入力", 52 "r7": "未入力", 53 "r8": "未入力", 54 "r9": "未入力", 55 "r10": "未入力", 56 "r11": "未入力", 57 "r12": "未入力", 58 "r13": "未入力", 59 "r14": "未入力", 60 "r15": "未入力", 61 "r16": "未入力", 62 "r17": "未入力", 63 "r18": "未入力", 64 "r19": "未入力", 65 "r20": "未入力" 66 } 67    ] 68}

jsonは実際には700程度のitemsがあります。
一組7人程度の100m走では正常にソートされ、10人を超える800mでは先述のような具合になります。

そこで種目ごとにソートしたあとレーンでソートすればどうかと思い、以下のように記述しましたが変化なし。

javascript

1 object_array_sort(items, 'compe', 'desc', function(new_data){ 2 object_array_sort(new_data, 'lane', 'desc', function(new_data2){ 3 num=0; 4 for (i in new_data2) { 5 item = new_data[i]; 6 compe = item.compe; 7 child = item.name; 8 sex = item.sex; 9 school = item.school; 10 grade = item.grade; 11 child2 = item.name2; 12 record = item.r0; 13 set = item.set; 14 lane = item.lane; 15 16 if(compe==socket.userName && set==Set){ 17 var socketID = socket.id ; 18 io.to(socketID).emit('message2',compe,child,sex,school,grade,child2,record,set,lane); 19 num = num+1; 20 } 21 } 22 }); 23 });

10以下のソートはうまくいくことから、なにか並び替えの関数で失敗しているように思えますがわかりません。
どなたかご教示いただけないでしょうか。

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

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

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

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

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

guest

回答2

0

文字列でソートしているからですね。
数値型に変換して比較すれば数値の大きさでソートされます。

javascript

1//オブジェクトソートの関数 2function object_array_sort(data,key,order,fn){ 3 //デフォは降順(DESC) 4 var num_a = order === 'asc' ? 1 : -1; 5 data = data.sort((a, b) => (Number(a[key]) - Number(b[key])) * num_a); 6}

投稿2020/09/15 02:17

yureighost

総合スコア2183

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

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

0

ベストアンサー

文字列としてソートしているからでは?
ソートの際にparseInt(parseFloat?)して比較すれば良いと思います

投稿2020/09/15 00:53

yambejp

総合スコア114883

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

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

Izumo1101

2020/09/15 12:55

var x = parseFloat(a[key]); var y = parseFloat(b[key]); なるほど言われてみれば確かに。 最初にご回答いただけたのでBAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問