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

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

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

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

jQuery

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

Q&A

解決済

3回答

1030閲覧

jQueryで複数のdatasetが設定された属性の取得方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/01/05 13:57

編集2018/01/05 14:04

うまく検索できなかったので、こちらで質問させてください……
(不十分かもしれませんが、丸投げではないアピールです)

今、htmlの構成は、下記のようになっています。

html

1<ul> 2 <li data-a="データA", data-b="データ1", data-c="データX"></li> 3 <li data-a="データA", data-b="データ2", data-c="データY"></li> 4 <li data-a="データA", data-b="データ3", data-c="データZ"></li> 5</ul>

このとき、

data-a の属性が データA かつ
data-b の属性が データ1 の場合の
data-c の属性を取得 (=ここでは、"データX")

したいのですが、jQueryを使用して、どのように記述すればいいですか?

ご教示のほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

属性セレクタ (Attribute selectors)

解決していますが、別解を。

JavaScript

1'use strict'; 2console.log(jQuery('[data-a="データA"][data-b="データ1"]').map((i, element) => element.dataset.c)); 3console.log(Array.prototype.map.call(jQuery('[data-a="データA"][data-b="データ1"]'), element => element.dataset.c));

セレクタについて勉強すると、コーディングの幅が広がります。

jQuery#attr()

jQuery#attr() はインデックス0の属性値を返すので、先頭の要素の属性が欲しいのなら、attr() で十分といえます。

JavaScript

1console.log(jQuery('[data-a="データA"][data-b="データ1"]').attr('data-c'));

アロー関数

コード中、"=>"がどこを指しているのか、何の処理を行っているのかがよく分かりません。

=>アロー関数の一部です。

先述のコードを「アロー関数」から通常の「関数式」に変更すると、次のコードになります。

JavaScript

1'use strict'; 2console.log(jQuery('[data-a="データA"][data-b="データ1"]').map(function (i, element) { return element.dataset.c})); 3console.log(Array.prototype.map.call(jQuery('[data-a="データA"][data-b="データ1"]'), function (element) { return element.dataset.c }));

Re: icicle さん

投稿2018/01/05 14:41

編集2018/01/05 15:29
think49

総合スコア18162

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

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

退会済みユーザー

退会済みユーザー

2018/01/05 15:14

前回に引き続き、回答ありがとうございます。 セレクタについて、簡単に調べてみましたが、申し訳ありません。 コード中、"=>"がどこを指しているのか、何の処理を行っているのかがよく分かりません。 追加の質問となりますが、ご教示いただけると助かります。
think49

2018/01/05 15:30

> コード中、"=>"がどこを指しているのか、何の処理を行っているのかがよく分かりません。 それは「アロー関数」というものです。 attr() にも触れて、親記事に追記しておきました。
退会済みユーザー

退会済みユーザー

2018/01/05 15:54

追加の解説ありがとうございました。セレクタとは似て非なるものだったんですね…… 関数式で説明されるとすんなり理解できました。とても分かりやすいです。 Array.prototypeも初耳でした。ここまで柔軟に書かれるとRubyを彷彿としてしまいます(?)
guest

0

条件に合致するものが必ずしも1つとは限りませんので注意が必要です

HTML

1<ul> 2 <li data-a="データA" data-b="データ1" data-c="データX"></li> 3 <li data-a="データA" data-b="データ2" data-c="データY"></li> 4 <li data-a="データA" data-b="データ3" data-c="データZ"></li> 5 <li data-a="データA" data-b="データ1" data-c="データX2"></li> 6</ul>

だとして、こうするとよいでしょう

とりあえず、なにか1個ヒットすればいい場合

javascript

1$(function(){ 2 var data_c=$('*').filter(function(){ 3 return $(this).data('a')=="データA" && $(this).data('b')=="データ1"; 4 }).data('c'); 5 console.log(data_c); 6});

全部取得する場合

javascript

1$(function(){ 2 var data_c=$.map( 3 $('*').filter(function(){ 4 return $(this).data('a')=="データA" && $(this).data('b')=="データ1"; 5 }),function(x){ 6 return x.getAttribute('data-c'); 7 }); 8 console.log(data_c); 9});

投稿2018/01/05 14:28

yambejp

総合スコア114779

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

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

退会済みユーザー

退会済みユーザー

2018/01/05 15:02

"全部取得する場合"のコードを解読してました。 $.map(array, callback(value, index))の構文を使ってると考えると、 arrayに当たるのが$('*').filter(function(){…})の部分で、 callback(value, index)に当たるのが、function(x){…}の部分ですよね。 arrayのほうでdatasetが'a'=="データA"の場合かつdatasetが'b'=="データ1"の場合を 配列としてすべて取得して、filter(fn)で条件に当てはまらない要素を削除して…… callback(value)に当たる部分、つまりxに取得した配列の先頭の要素が入って、 data-cの属性を取得して変数data_cに配列として返してるのかな…… 間違えてたらすみません(´・ω・`)
guest

0

ベストアンサー

JavaScript

1$( function() { 2 let arr = []; 3 $( '[data-a][data-b][data-c]' ).each( function() { 4 let $_t = $( this ); 5 if ( $_t.data( 'a' ) === 'データA' && $_t.data( 'b' ) === 'データ1' ) { 6 arr.push( $_t.data( 'c' ) ); 7 } 8 } ); 9 console.log( arr ); 10} ); 11```**動くサンプル:**[https://jsfiddle.net/gpudx383/](https://jsfiddle.net/gpudx383/)

投稿2018/01/05 14:12

kei344

総合スコア69400

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

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

退会済みユーザー

退会済みユーザー

2018/01/05 14:15

サンプル確認しました。迅速な回答ありがとうございます! 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問