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

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

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

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

Q&A

解決済

1回答

1628閲覧

jQuery連想配列で、指定した値がある階層から、別の値を取り出したい

tefu-tefu

総合スコア29

jQuery

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

0グッド

0クリップ

投稿2020/06/07 13:32

編集2020/06/07 13:51

###実現したいこと
以下lisから指定条件をクリアする階層のboxの値を取得したいです。

jQuery

1var lis = [ 2 { width:20, height:20, box:'box20' }, 3 { width:50, height:50, box:'box50' }, 4];

###発生している問題
たとえば「width30以上」という条件ならbox50がほしいのですが、box50でなく{ width:50, height:50, box:'box50' }がまるごと返ってきてしまいます。

###該当のソースコード
下記のようにreturn elem.box;としているのにまるごとその階層のオブジェクトが返ってきてしまいます。しかもきちんとコンソールでelem.boxは「box50」ですというのは出ているのですが、なぜなのでしょうか。

jQuery

1var result = $.grep(lis,function(elem, i) { 2 if(elem.width > 30){ 3 console.log('elem.boxは「' + elem.box + '」です'); 4 return elem.box; 5 } 6}); 7console.log(result);

###試したこと
上記しましたがコンソールで値を確認してもできないので、いったんgrepはやめて他のを試しました。

しかし以下filterでできす。

jQuery

1var result = lis.filter(function(elem, i){ 2 if(elem.width > 30){ 3 return elem.box; 4 } 5}); 6console.log(result);

さらに以下forEachでもできず。

jQuery

1var result = lis.forEach( function(elem, i){ 2 if(elem.width > 30){ 3 return elem.box; 4 } 5}); 6console.log(result);

打つ手なしといった状況です。

もちろん、resultからresult[0]['box']とすれば取り出せますが、そうでなくresultの時点でbox50を取り出したいのです。

わかる方いらっしゃったら宜しくお願い致します!

###追記
kei344様にご指摘頂きました点を追記させて頂きます。

できれば「30以上で、一番小さいもの」がいいと思っています。例えば以下なら「box31」を取り出すことができましたら!

jQuery

1var lis = [ 2 { width:20, height:20, box:'box20' }, 3 { width:50, height:50, box:'box50' }, 4 { width:31, height:50, box:'box31' }, 5];

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

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

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

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

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

kei344

2020/06/07 13:36

複数合致する場合はどう処理するつもりなのでしょう。先頭だけ?
tefu-tefu

2020/06/07 13:42

たしかにそうですね。不手際すみません。 できれば「30以上で、一番小さいもの」がいいと思っています。例えば以下なら「box31」を取り出すことができましたら! var lis = [ { width:20, height:20, box:'box20' }, { width:50, height:50, box:'box50' }, { width:31, height:50, box:'box31' }, ];
kei344

2020/06/07 13:44

この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、質問本文に追記することをお勧めします。
guest

回答1

0

ベストアンサー

いろいろ方法は在ると思いますが一例。

js

1var lis = [ 2{ width:20, height:20, box:'box20' }, 3{ width:50, height:50, box:'box50' }, 4{ width:31, height:50, box:'box31' }, 5]; 6var res = ( lis.sort( ( a, b )=> a.width - b.width ).find( v => v.width > 30 ) || { box: '' } ).box; 7console.log( res, lis );

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

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

投稿2020/06/07 13:53

kei344

総合スコア69606

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

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

tefu-tefu

2020/06/07 14:04

どうもありがとうございます。filterはともかくsortは初見で、しかもそれらをつなげるとは画期的でとても勉強になりました。
kei344

2020/06/07 14:07

filterじゃなくfindですよ。
tefu-tefu

2020/06/07 14:11

危なかったです…だからsortが役に立つのですね。filterでどういう仕組みでできるのかと悩んでいましたwご親切にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問