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

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

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

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

Q&A

解決済

4回答

1094閲覧

配列とループの組み合わせについて

kakeru99

総合スコア17

JavaScript

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

0グッド

0クリップ

投稿2019/04/02 02:44

編集2019/04/02 03:42

(↓)の配列があります

javascript

1// 市区町村の数 2let area = [39, 33, 54]; 3 4let city =[ 5'千代田区OK中央区OK港区OK新宿区OK文京区NG・・・', 6'横浜市NG川崎市OK横須賀市OK・・・', 7'千葉市OK銚子市NG市川市NG・・・' 8];

cityの文字列があらかじめ配列であるとしてOKかNGかを検索して一致するかどうかをifで判定させ、それを上記の市区町村の数だけループさせるとした場合どのように組めばいいでしょうか?

自分なりに組んでみたこと。

javascript

1let z = 0; 2for (m = 0; m < city; m++) { 3 if (city[m].indexOf(area[z]) !== -1) { 4 5 } else { 6 7 } 8}

もしわかる方がいれば教えて頂けると恐縮です。
宜しくお願い致します。

質問への追記・修正

  • areaは市区町村の数
  • areaとcityは1:1で対応している
  • cityは省略していますが要素1なら東京都の市区町村名とOKもしくはNGの文字列が格納されている

得たいプログラムの記述

cityの配列の要素1の場合,areaの要素1の数値分だけループ
→文字列のはじめから順番に検索していきOKと一致するとtrue、NGの場合はfalseをif文で記述。2回目は1回目に一致したその直後から再度検索していく
cityの配列の要素2の場合,areaの要素2の数値分だけループ
→文字列のはじめから順番に検索していきOKと一致するとtrue、NGの場合はfalseをif文で記述。2回目は1回目に一致したその直後から再度検索していく
cityの配列の要素3の場合,areaの要素3の数値分だけループ
→文字列のはじめから順番に検索していきOKと一致するとtrue、NGの場合はfalseをif文で記述。2回目は1回目に一致したその直後から再度検索していく

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

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

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

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

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

Lhankor_Mhy

2019/04/02 02:47

let area = [39, 33, 54]; ↑これはなにを表わしていますか?
kei344

2019/04/02 02:49

cityの例をより実際に近い形にしてください。今の状態では「OK」で分割することになりますが、そういうデータではないですよね。
kakeru99

2019/04/02 02:55

Lhankor_Mhyさん let area = [39, 33, 54]; は市区町村の数になります。
kakeru99

2019/04/02 02:59

kei344さん スクレイピングして取得した配列がこのような配列になります。 そのためOKで分割で問題ないんです。 実際では東京の電車遅延があるかどうかの判定で OK→平常運転 NG→列車遅延 という形のスクリプトを作りたいと思っています。 わかりにくくてすみませんm(_ _)m
Lhankor_Mhy

2019/04/02 03:01

「OKかNGかを検索して一致するかどうか」とは、何と一致するかどうかを見るのですか?
kei344

2019/04/02 03:04

let area = [39, 33, 54]; は「千代田区…」「横浜市…」「千葉市…」と1:1で対応している物ですか?1レコード目は東京で39市区町村、ということでしょうか。
kakeru99

2019/04/02 03:06

cityの配列にある文字列をはじめから順番に検索していきOKと一致するとtrue、2回目は1回目に一致したその直後から再度検索していくといった流れのプラグラムです。 areaの配列はループの回数として利用する想定でした。
kakeru99

2019/04/02 03:08

kei344さん > let area = [39, 33, 54]; は「千代田区…」「横浜市…」「千葉市…」と1:1で対応している物ですか?1> レコード目は東京で39市区町村、ということでしょうか。 その通りです。
Lhankor_Mhy

2019/04/02 03:10

NGと市町村名はすっとばしていい、ということですね?
kakeru99

2019/04/02 03:13

OKとNGを条件分岐、市区町村名はすっとばして大丈夫です。
kei344

2019/04/02 03:16

(質問文は編集できます)この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、データの説明と得たいデータの最終形態(どういう配列か)を質問本文に追記することをお勧めします。
kakeru99

2019/04/02 03:34

質問を修正してみました。わかりますでしょうか。
kei344

2019/04/02 03:39

こちらの環境では変更/修正が確認できませんでした。すみませんが、もう一度確認してもらえませんか?最近teratailで修正が保存されない事がたまにあるようなので・・・。
kakeru99

2019/04/02 03:42

kei344さん すみません。きちんと送信できていなかったようで・・・。 次はきちんと更新できました。
kei344

2019/04/02 03:46

編集ありがとうございます。例えば、「東京の電車遅延があるかどうかの判定」であれば1個でも「NG」が含まれていたら「遅延あり」になりますが、それだけの情報でよいのでしょうか。
miyabi-sun

2019/04/02 03:52

> cityの配列の要素1の場合,areaの要素1の数値分だけループ これは命令です。 これでは「お前は黙って俺の言うことに従っていればいいんだ」と怒鳴り散らす無能な上司です。 目的を書いてください。
guest

回答4

0

難しいデータを難しいまま扱おうとして挫折するのは初心者によくある光景です。
簡単でわかりやすく、扱いやすいデータにしましょう。

JavaScript

1let city =[ 2 '千代田区OK中央区OK港区OK新宿区OK文京区NG', 3 '横浜市NG川崎市OK横須賀市OK', 4 '千葉市OK銚子市NG市川市NG' 5]; 6 7// 調査 8for (let citiesName of city) { 9 console.log(citiesName.split(/(OK|NG)/)); 10 // ["千代田区", "OK", "中央区", "OK", "港区", "OK", "新宿区", "OK", "文京区", "NG", ""] 11 // ["横浜市", "NG", "川崎市", "OK", "横須賀市", "OK", ""] 12 // ["千葉市", "OK", "銚子市", "NG", "市川市", "NG", ""] 13 14 // 最後の空文字を削除する 15 console.log(citiesName.split(/(OK|NG)/).slice(0, -1)); 16 // ["千代田区", "OK", "中央区", "OK", "港区", "OK", "新宿区", "OK", "文京区", "NG"] 17 // ["横浜市", "NG", "川崎市", "OK", "横須賀市", "OK"] 18 // ["千葉市", "OK", "銚子市", "NG", "市川市", "NG"] 19} 20 21const cityList = []; 22for (let citiesName of city) { 23 const result = {}; 24 const nameAndCondition = citiesName.split(/(OK|NG)/).slice(0, -1); 25 for (let i = 0; i < nameAndCondition.length; i += 2) { 26 const name = nameAndCondition[i]; 27 const condition = nameAndCondition[i + 1] === 'OK'; 28 // もしNGの都市を捨てるならこの行のコメントアウトを削る 29 // if (!condition) continue; 30 result[name] = condition; 31 } 32 cityList.push(result); 33} 34console.log(cityList); 35// [ 36// {千代田区: true, 中央区: true, 港区: true, 新宿区: true, 文京区: false}, 37// {横浜市: false, 川崎市: true, 横須賀市: true}, 38// {千葉市: true, 銚子市: false, 市川市: false} 39// ]

このままではまだ質問者さんの使いたいデータに届いてないかも知れませんね。
ですが、最初のクソみたいな文字列からすれば大きな前進が出来たと思います。

このように人間が扱いやすいデータに作り変えてから使用する癖を付けましょう。

腕の良いエンジニアは難しい計算を難しい計算のまま行うのではなく、
子供でもわかる簡単な計算に作り変えてしまうから不具合が少ないのです。
この問題をいかに簡単に出来るのかが腕の見せどころなので、色んなデータを作り変えるというのを試してみて下さい。

投稿2019/04/02 04:15

編集2019/04/02 04:17
miyabi-sun

総合スコア21158

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

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

0

元のコードを生かしてみました。

js

1 let city =[ 2 '千代田区OK中央区OK港区OK新宿区OK文京区NG・・・', 3 '横浜市NG川崎市OK横須賀市OK・・・', 4 '千葉市OK銚子市NG市川市NG・・・' 5 ]; 6 7 for (m = 0; m < city.length; m++) { 8 var target = city[m].slice(0); 9 while (true){ 10 var n; 11 12 n = target.indexOf('OK'); 13 if ( n !== -1) { 14 target = target.slice(n+2); 15 console.log("OK", target); 16 continue; 17 } 18 19 n = target.indexOf('NG'); 20 if ( n !== -1) { 21 target = target.slice(n+2); 22 console.log("NG", target); 23 continue; 24 } 25 26 break; 27 } 28 }

投稿2019/04/02 03:43

編集2019/04/02 03:51
Lhankor_Mhy

総合スコア36104

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

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

0

javascript

1let city =[ 2'千代田区OK中央区OK港区OK新宿区OK文京区NG', 3'横浜市NG川崎市OK横須賀市OK', 4'千葉市OK銚子市NG市川市NG' 5]; 6const oks = city 7 .map(e=>e.split(/(OK|NG)/)) 8 .flatMap(e=> e.reduce( (ac,c,i,ar)=> i % 2 === 1 && c === "OK" ? ac.concat(ar[i-1]) : ac,[] )) 9console.log(oks.includes("中央区")); 10console.log(oks.includes("文京区"));

「得たいプログラムの記述」をコード化しました。

ループのやりかたは書いてありましたが、どう結果を得たいのかわからなかったので、stackというのに判定したtrueだか、falseだかを入れてます。

javascript

1let area = [39, 33, 54]; 2 3let city =[ 4'千代田区OK中央区OK港区OK新宿区OK文京区NG・・・', 5'横浜市NG川崎市OK横須賀市OK・・・', 6'千葉市OK銚子市NG市川市NG・・・' 7]; 8 9let stack = []; 10for(let areaIdx = 0; areaIdx < area.length; areaIdx++) { 11 let boolarrayForArea = []; 12 stack.push(boolarrayForArea); 13 const str = city[areaIdx]; 14 let fromIdx = 0; 15 let noPos = -1; 16 let okPos = -1; 17 for(let cityIter = 0; cityIter < area[areaIdx]; cityIter++) { 18 ngPos = str.indexOf("NG", fromIdx) === -1 ? Number.MAX_VALUE : str.indexOf("NG", fromIdx) ; 19 okPos = str.indexOf("OK", fromIdx) === -1 ? Number.MAX_VALUE : str.indexOf("OK", fromIdx) ; 20 const nextPos = Math.min(ngPos, okPos); 21 const nextWord = str.substr(nextPos,2); 22 if (nextWord === "OK") { boolarrayForArea.push(true); } 23 else if (nextWord === "NG") { boolarrayForArea.push(false); } 24 else { boolarrayForArea.push(undefined); } 25 fromIdx = nextPos + 2; 26 } 27} 28console.log(stack);

投稿2019/04/02 03:19

編集2019/04/03 01:58
papinianus

総合スコア12705

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

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

0

自己解決

回答ありがとうございました。
その後、miyabi-sunのソースを元に試行錯誤して下記のように動かすことができました。
質問するのも難しいですが勉強になりました。

html

1<div class="area"> 2<ul> 3 <li></li> 4 <li></li> 5 <li></li> 6 <li></li> 7 <li></li> 8 <li></li> 9 <li></li> 10 <li></li> 11 <li></li> 12 <li></li> 13</ul> 14 15<ul> 16 <li></li> 17 <li></li> 18 <li></li> 19 <li></li> 20 <li></li> 21 <li></li> 22 <li></li> 23 <li></li> 24 <li></li> 25 <li></li> 26</ul> 27 28<ul> 29 <li></li> 30 <li></li> 31 <li></li> 32 <li></li> 33 <li></li> 34 <li></li> 35 <li></li> 36 <li></li> 37 <li></li> 38 <li></li> 39</ul> 40</div>

javascript

1let city = [ 2 '千代田区OK中央区OK港区OK新宿区OK文京区NG', 3 '横浜市NG川崎市OK横須賀市OK', 4 '千葉市OK銚子市NG市川市NG' 5]; 6 7const cityList = []; 8for (let citiesName of city) { 9 let u = city.indexOf(citiesName); 10 let u_num = ':nth-of-type(' + (u + 1) + ')'; 11 const nameAndCondition = citiesName.split(/(OK|NG)/).slice(0, -1); 12 for (let i = 0; i < nameAndCondition.length; i += 2) { 13 const name = nameAndCondition[i]; 14 const condition = nameAndCondition[i + 1]; 15 let num_box = ':nth-of-type(' + (i / 2 + 1) + ')'; 16 if (condition === 'OK') {} else { 17 //OKと一致しない場合の処理 18 $('.area ul' + u_num + ' li' + num_box).text("×"); 19 } 20 } 21}

投稿2019/04/09 06:02

kakeru99

総合スコア17

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

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

papinianus

2019/04/09 15:46

低評価の理由:質問者自身が指示した「得たいプログラム」でない
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問