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

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

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

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

Q&A

解決済

1回答

223閲覧

連装配列オブジェクトの配列に対し、指定キーでソ―ト

nikuatsu

総合スコア177

JavaScript

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

0グッド

0クリップ

投稿2022/06/15 20:11

編集2022/06/15 20:17

前提

JavaScriptで、連装配列オブジェクトの配列に対し、指定キーでソ―トしたいです。

実現したいこと

具体例として、以下objを渡し、obj["tags"]の配列を、【指定キー】でソートして【目的の値】を得たいのです。

発生している問題

自分なりの関数sort_tagsを作ったのですが、sort_keysでのソートが実現できません。

対象となるオブジェクト

JavaScript

1const obj = { 2 "id": "1", 3 "tags": [ 4 { 5 "kind": "genre", 6 "name": "ジャンルA", 7 }, 8 { 9 "kind": "book", 10 "name": "本A", 11 }, 12 { 13 "kind": "genre", 14 "name": "ジャンルB", 15 }, 16 { 17 "kind": "user", 18 "name": "ユーザーA", 19 } 20 ] 21};

実現したいこと(例1)

【指定キー】

JavaScript

1const sort_keys = [ "user", "book", "genre" ];

【目的の値】

JavaScript

1{ 2 "id": "1", 3 "tags": [ 4 { 5 "kind": "user", 6 "name": "ユーザーA", 7 }, 8 { 9 "kind": "book", 10 "name": "本A", 11 }, 12 { 13 "kind": "genre", 14 "name": "ジャンルA", 15 }, 16 { 17 "kind": "genre", 18 "name": "ジャンルB", 19 } 20 ] 21};

実現したいこと(例2)

【指定キー】

JavaScript

1const sort_keys = [ "book", "genre", "user" ];

【目的の値】

JavaScript

1{ 2 "id": "1", 3 "tags": [ 4 { 5 "kind": "book", 6 "name": "本A", 7 }, 8 { 9 "kind": "genre", 10 "name": "ジャンルA", 11 }, 12 { 13 "kind": "genre", 14 "name": "ジャンルB", 15 }, 16 { 17 "kind": "user", 18 "name": "ユーザーA", 19 }, 20 ] 21};

試したこと

次の関数sort_tagsを作ったのですが、順序を変えることができませんでした。

JavaScript

1console.log( sort_tags( obj ) ); 2 3function sort_tags( obj ) { 4 5 const sort_keys = [ "user", "book", "genre" ]; 6 7 let result = {}; 8 9 Object.keys(obj).forEach( key => { 10 11 if ( key === 'tags' ) { 12 13 result.tags = []; 14 15 obj.tags.forEach( tag_info => { 16 17 sort_keys.forEach( sort_key => { 18 19 if ( sort_key === tag_info.kind ) { 20 result.tags.push({ 21 kind: sort_key, 22 name: tag_info.name 23 }); 24 } 25 26 }); 27 28 }); 29 30 } else { 31 result[key] = obj[key]; 32 } 33 34 }); 35 36 return result; 37 38}

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

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

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

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

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

guest

回答1

0

ベストアンサー

sort() を使えばいいのでは

const obj = { "id": "1", "tags": [ { "kind": "genre", "name": "ジャンルA", }, { "kind": "book", "name": "本A", }, { "kind": "genre", "name": "ジャンルB", }, { "kind": "user", "name": "ユーザーA", } ] }; const sort_keys = [ "user", "book", "genre" ]; obj.tags.sort((a,b) => sort_keys.indexOf(a['kind']) < sort_keys.indexOf(b['kind']) ? -1 : sort_keys.indexOf(a['kind']) > sort_keys.indexOf(b['kind']) ? 1 : a['name'] < b['name'] ? -1 : 1 ) console.log(obj.tags); // [ // { // "kind": "user", // "name": "ユーザーA" // }, // { // "kind": "book", // "name": "本A" // }, // { // "kind": "genre", // "name": "ジャンルA" // }, // { // "kind": "genre", // "name": "ジャンルB" // } // ]

投稿2022/06/15 22:56

編集2022/06/15 22:58
sigsegv

総合スコア895

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

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

nikuatsu

2022/06/15 23:48

すばらしく便利な方法をどうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問