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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

335閲覧

不揃いなキーでオブジェクトをソートする方法はありますか?

kuroean

総合スコア12

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/08/08 04:12

前提・実現したいこと

オブジェクトから不揃いなキーを指定してソートしたいです。

該当のソースコード

下記オブジェクト「lists」は別のオブジェクトから抽出されたものでして、3種類の「x_num」「y_num」「z_num」があります。(必ずいずれかが存在します。)

const lists = [ {name: 'berry', x_num: '1' }, {name: 'apple', y_num: '3' }, {name: 'melon', z_num: '2' } ];

このオブジェクトに対して「●_numでソートしたい」となった場合、どのようにすればよろしいでしょうか?

(恐れ入りますがjQuery寄りなコードで教えて頂けますと幸いです。)

試したこと

現状は下記で「name」を指定しており、['apple','berry','melon'] の順でソートされます。

お聞きしたいのはこれを「●_num」で指定する方法で、つまり ['apple','melon','berry'] の順で取得したいということです。

jquery

1 2 3 4function getSortKey(){ 5 return 'name'; // 「name」ならできるが、これを「●_num」でソートしたい 6} 7 8function sortObj(a, b) { 9 10 const sortKey = getSortKey(); 11 12 const genreA = a[sortKey].toUpperCase(); 13 const genreB = b[sortKey].toUpperCase(); 14 15 let comparison = 0; 16 if (genreA > genreB) { 17 comparison = 1; 18 } else if (genreA < genreB) { 19 comparison = -1; 20 } 21 return comparison; 22} 23 24const result = lists.sort(sortObj); 25console.log(result);

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

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

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

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

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

guest

回答5

0

Object.keys() で対象のキー一覧を取得して、キーがマッチするものを探せばよいです。
(キーの条件が複雑なら正規表現、簡単なら文字列系の関数で処理)

【Object.keys() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

投稿2019/08/08 04:21

kei344

総合スコア69364

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

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

kuroean

2019/08/08 07:04

他の方のコードが何をやっているものなのか、リンク先のおかげでなんとなくわかりました。ありがとうございました。
guest

0

ベストアンサー

keyがどれか1つという事であれば下記ではどうでしょうか?

javascript

1lists.sort((a,b) => (a.x_num || a.y_num || a.z_num) - (b.x_num || b.y_num || b.z_num))

投稿2019/08/08 04:24

yamap55

総合スコア1376

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

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

m.ts10806

2019/08/08 04:26

「●_numでソートしたい」という要件なのでx,y,zはあくまで例で本当はもっとたくさんあるものと思われます。
yamap55

2019/08/08 04:39

確かにその通りでした。ご指摘ありがとうございます。 削除リクエスト出しておきます。
m.ts10806

2019/08/08 04:41

たぶん削除リクエスト通る内容ではないので(誤操作による重複投稿とかじゃないと) 一言補足しておくか、別の回答を考えてみるかどちらかにすると良いと思います。
otn

2019/08/08 05:03

> 3種類の「x_num」「y_num」「z_num」があります。(必ずいずれかが存在します。) なので、これでいいのでは?
m.ts10806

2019/08/08 05:05 編集

otnさん 確かに。見落としと拡大解釈でした。 yamap_55さん 失礼しました。
kuroean

2019/08/08 07:03

すごです。1行とわ。どうもありがとうございます。 質問がわかりにくく混乱を招いてしまったようで、失礼いたしました。
guest

0

3種類の「x_num」「y_num」「z_num」があります。

3種類しかないと分かってるなら
順番にアクセスすれば良いんじゃないですか?

x_numの中身の値が2と3なら2を先にしたいとかいう条件も加わるとするならば、
中身の値が0〜9999と仮定すれば10,000点でも加算すれば十分でしょうかね。

  • obj.x_num: "1": 10,000点加算して, 10001の数値として計算
  • obj.y_num: "2": 20,000点加算して, 20001の数値として計算
  • obj.z_num: "3": 30,000点加算して, 30001の数値として計算

存在しないキーは常にundefinedになるので、
undefinedか否かを検証するのにおすすめな書き方
obj.x_num == nullを使いましょう。

JavaScript

1const a = {name: 'berry', x_num: '1' }; 2let scoreA = 0; 3if (a.x_num != null) scoreA += 10000 + Number(a.x_num); 4if (a.y_num != null) scoreA += 20000 + Number(a.y_num); 5if (a.z_num != null) scoreA += 30000 + Number(a.z_num); 6console.log(scoreA); // 10001

sortメソッドに突っ込む関数はreturn値が0, プラスの値, マイナスの値で分岐するので単純にreturn scoreA - scoreBで動作するはずです。

投稿2019/08/08 04:32

miyabi-sun

総合スコア21158

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

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

kuroean

2019/08/08 08:30

すみません確認が遅くなりました。1つずつ書いていただいてわかりやすかったです。ありがとうございました。
guest

0

無理やりやるとこんな感じです

javascript

1const lists = [ 2 {name: 'berry', x_num: '1' }, 3 {name: 'apple', y_num: '3' }, 4 {name: 'melon', z_num: '2' } 5]; 6var newLists=lists.map(x=>{ 7 Object.keys(x).forEach(y=>{ 8 if(y.match(/_num$/)){ 9 x.sort=x[y]; 10 } 11 }); 12 return x; 13}).sort((x,y)=>x.sort-y.sort).map(x=>{ 14 delete(x.sort); 15 return x; 16}); 17console.log(newLists);

投稿2019/08/08 04:27

yambejp

総合スコア114572

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

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

kuroean

2019/08/08 07:05

こちらならkeyが質問の3つだけでなくても対応できますね。ありがとうございます。じっくり読み解かせていただきます。
guest

0

JavaScript

1 const genreA = a[Object.keys(a).find(x => x.endsWith('_num'))].toUpperCase(); 2 3 // jQuery 4 let name = ''; 5 $.each(a, function(propertyName, value) { 6 if (propertyName.endsWith('_num')) { 7 name = propertyName; 8 return true; 9 } 10 }); 11 const genreA = a[name].toUpperCase();

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find
https://api.jquery.com/jQuery.each/#jQuery-each-object-callback

投稿2019/08/08 04:47

x_x

総合スコア13749

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

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

kuroean

2019/08/08 07:07 編集

すみませんプロの方のコードは難しいのですが、そちらはどうやって書くのですか? 普通にやってもconstが2つあるせいでエラーでした→https://jsfiddle.net/x5whrknp/ ご提示のものは変数を独自に変えていらっしゃるかと思うのですが、それらの関連性がつかめませんで、よろしければすべてのコードで見せていただけないでしょうか。
x_x

2019/08/08 09:36

jQuery がほしいということで二つのコードを用意したまでです
kuroean

2019/08/08 11:50

2つあるconstのうち、上はJavascript版だ。ということでしょうか? するとJavaScript版だとこちらになりますか? const lists = [ {name: 'berry', x_num: '1' }, {name: 'apple', y_num: '3' }, {name: 'melon', z_num: '2' } ]; const genreA = a[Object.keys(a).find(x => x.endsWith('_num'))].toUpperCase(); console.log(genreA); しかしこちらでもエラーになるようで…
x_x

2019/08/08 14:33

提示コードに変数名を合わせて回答したのですが、最初の提示コードの内容もわかっていないということでしょうか?
kuroean

2019/08/08 16:24

変数名を合わせて、とはどういう意味でしょうか?どの変数を合わせてどの変数をかえたのか、意図がわかりません。私の返信ではどこがおかしくなっているせいで、処理できなくなっているのですか?
kuroean

2019/08/08 16:25

処理できるフルコードでいただけませんでしょうか。問題は他の方のご回答で解決しているのですがこのお答えが不明なので、それをいただければ自分で調べます。
kuroean

2019/08/08 16:58

To: key344さん 余計なお手間とらせてしまってすみません。ご親切にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問