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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

581閲覧

指定状態まで同じ処理を繰り返す

skipping

総合スコア14

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/05 00:15

番号と照合する処理を繰り返す方法を探しております。

下記のHTMLで、ancestor="x-a-c-g"を基準として、リストと照合し、

ancestor="x-a-c-g"を表示
ancestor="x-a-c"を表示
ancestor="x-a"を表示

という風に最後の2つになるまで照合する処理を繰り返すことが目的です。

html

1<style> 2.list {display: none;} 3<style> 4 5<li class="list"> 6 Xさん</li> 7<li class="list" ancestor="x"> 8 aさん(xさんの子)</li> 9<li class="list" ancestor="x-a"> 10 bさん(aさんの子)</li> 11<li class="list" ancestor="x-a"> 12 cさん(aさんの子)</li> 13<li class="list" ancestor="x"> 14 dさん(xさんの子)</li> 15<li class="list" ancestor="x-a-c"> 16 eさん(cさんの子)</li> 17<li class="list" ancestor="x-d"> 18 fさん(dさんの子)</li> 19<li class="list" ancestor="x-a-c"> 20 gさん(cさんの子)</li> 21<li class="list" ancestor="x-a-b"> 22 hさん(bさんの子)</li> 23<li class="list" ancestor="x-a-b-h"> 24 iさん(hさんの子)</li> 25<li class="list" ancestor="x-a-c-g"> 26 jさん(gさんの子)</li> 27<li class="list" ancestor="x"> 28 kさん(xさんの子)</li> 29<li class="list" ancestor="x-a-c-e"> 30 lさん(eさんの子)</li> 31<li class="list" ancestor="x-a-c-g"> 32 mさん(gさんの子)</li> 33<li class="list" ancestor="x-a-c-g-m"> 34 nさん(mさんの子)</li>

イメージとしては下記のようなjQueryになると思うのですが、処理を繰り返す方法がわからず、お恥ずかしながらこのような書き方になってしまいます。

jQuery

1//ターゲット 2var target = 'x-a-c-g'; 3 4//ターゲットのリスト(mさん、jさん)を表示 5$( '.list' ).each( function() { 6 var list = $(this).attr('ancestor'); 7 if( target == list ){ 8 $(this).fadeIn(); 9 } 10}); 11 12//ターゲットの先祖のリスト(gさん、eさん、cさん、bさん)を表示 13$( '.list' ).each( function() { 14 15 //【1】1段前の親(gさん、eさん)を開く 16 var list_slice1 = $(this).attr('ancestor').split('-').slice(0, -1).join('-'); 17 var target_slice1 = target.split('-').slice(0, -1).join('-'); 18 if( target_slice1 == target_slice1 ){ 19 $(this).fadeIn(); 20 } 21 22 //【2】2段前の親(cさん、bさん)を開く 23 var list_slice2 = $(this).attr('ancestor').split('-').slice(0, -2).join('-'); 24 var target_slice2 = target.split('-').slice(0, -2).join('-'); 25 if( target_slice2 == target_slice2 ){ 26 $(this).fadeIn(); 27 } 28 29}); 30

質問をまとめますと、jQueryの【1】【2】の部分を繰り返す方法についてです。

(ただし基準となるのはancestor="x-a-c-g"とは限らずancestor="x-a-c-g-m-p-t-w"になったりと都度その長さが異なるので、上のjQueryのように「sliceする数を増やす」ではいくつ増やせばいいかわかりません。きっと正しい処理は「基準のハイフンが1個になるまで繰り返す」のようなイメージかと思います。)

親子関係にしては構造がおかしなHTMLで大変恐縮ですが、ひとまずこの構造で目的が達成できるような方法をご教示頂ければ幸甚に存じます。

どんなアドバイスでも構いませんので、何卒ご指導のほど宜しくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ではヒントワードだけ。

「再帰」

で調べてみてください。

他の方から丸っとコード例が出てきちゃうかもしれませんが、私はあえてここまでしか回答しません。

投稿2018/09/05 00:22

spookybird

総合スコア1803

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

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

skipping

2018/09/05 01:35

調べて来たのですが…、私にはまだまだ、遠かったです。とはいえヒントをありがとうございます。今後とも精進致します。どうぞまた宜しくお願い致します。
guest

0

ベストアンサー

こういうことですか?

javascript

1var str="x-a-c-g-m-p-t-w"; 2var arr=[]; 3var c=0; 4while(r=str.match(new RegExp("(.+)(?:-.?){"+(c+1).toString()+"}$"))){ 5 arr.unshift(r[1]); 6 if(c>10) break; 7 c++; 8} 9console.log(arr);

修正版

javascript

1var str="x-aaa-111-222bbb-ccc333"; 2var arr=[]; 3var c=0; 4while(r=str.match(new RegExp("(.+)(-.+){"+c+"}$"))){ 5 arr.unshift(r[1]); 6 if(c>10) break; //上限設定 7 c++; 8} 9console.log(arr);

「-」で始まる「なにか」がc回繰り返して文末になるものをヒットし
その前の部分を(.+)で受けて、rという変数に渡している
参照は1つ目のカッコなのでr[1]

投稿2018/09/05 00:32

編集2018/09/05 01:54
yambejp

総合スコア114837

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

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

skipping

2018/09/05 01:21

ありがとうございます。できました。 質問の構造の場合はできたのですが (https://jsfiddle.net/6xp89Lht/2/) ひょっとしてアルファベットでなく数字だったり、またはクラスの位置が変わるとできないでしょうか? (https://jsfiddle.net/6xp89Lht/) ご提示いただいたコードが難解でアレンジを効かせる余力がございませんで、誠に心苦しいのですがもう一声頂けませんでしょうか。
yambejp

2018/09/05 01:27

2文字以上になる可能性があるということですかね? RegExpのカッコ内にある「?:-.?」を「?:-.+?」に変えてみてください
skipping

2018/09/05 01:34

なるほど、文字数の問題でしたか。できました。たびたびのご返信、心から感謝申し上げます。 「?:-.?」や「?:-.+?」は何を表すのでしょうか。これを検索して。で結構ですのでご教示頂けたらと思います。お忙しければここでスルーして頂いて構いません。誠にありがとうございました。
yambejp

2018/09/05 01:55

修正と解説をちょこっといれておきました
skipping

2018/09/05 02:19

ご丁寧にどうもありがとうございます。とても助かりました。よく勉強しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問