入力した数字をnとして
行の最初からn文字が一致する行全体を削除して、重複をなくしたものを表示するプログラムを作ろうとしていたのですが、どうやっても上手く行きません。
上のテキストエリアにを入力すると,左下に重複を消した全ての行列(重複2個なら1個に、重複が5個なら1個にした行列)が表示され、
右側には重複したものをすべて表示するようにしたいです。
例えば最初の行数がN行だとして
m(<N)番目の最初のn文字と、
m+2(<N),m+5(<N)の最初のn文字が重複している時、
のように1つの行に対して、重複行が他に2つ以上あるとおかしくなります。
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <script src="http://code.jquery.com/jquery-latest.js"></script> 8 <title>pasword generator</title> 9</head> 10<style> 11 textarea { 12 outline: none; 13 border: 1px solid #aaa; 14 -webkit-transition: all .3s; 15 transition: all .3s; 16 } 17 textarea:focus { 18 box-shadow: 0 0 7px #1abc9c; 19 border: 1px solid #1abc9c; 20 } 21 #inputNum { 22 outline: none; 23 border: 1px solid #aaa; 24 -webkit-transition: all .3s; 25 transition: all .3s; 26 } 27 #inputNum:focus { 28 box-shadow: 0 0 7px #1abc9c; 29 border: 1px solid #1abc9c; 30 } 31 #input { 32 margin-top: 10px; 33 } 34 #button { 35 width: 100px; 36 font-size: 20px; 37 background-color: #333; 38 border: 2px solid #333; 39 color: #fff; 40 line-height: 50px; 41 transition: all .3s; 42 } 43 #button:hover { 44 background-color: #fff; 45 border-color: #1abc9c; 46 color: #1abc9c; 47 } 48 .box,.box2 { 49 display: none; 50 } 51</style> 52<body> 53 <div> 54 <span>最初からn文字が一致する行を削除.</span> 55 <input type="text" id="inputNum"> 56 </div> 57 58 <div><textarea id="input" cols="100" rows="40"></textarea></div> 59 <div><input id="button" type="button" value="変 換"></div> 60 <textarea id="output" cols="100" rows="40"></textarea> 61 <textarea id="output2" cols="100" rows="40"></textarea> 62 <div class="box"></div> 63 <div class="box2"></div> 64 65 <script> 66 (function(){ 67 'use strict'; 68 69 $('#button').click(function(){ 70 var textn = $('#input').val().replace(/\r\n|\r/g, '\n'); 71 var lines = textn.split('\n'); //line配列に格納 72 73 var firstNChars = parseInt($('#inputNum').val()); 74 var lineFirstChars=[]; //先頭n文字の配列 75 76 var rightArray = []; //重複したものを1つずつ 77 78 for(var i=0; i<lines.length; i++){ 79 lineFirstChars.push(lines[i].slice(0,firstNChars));//先頭n文字の配列 80 } 81 82 for(var j=0; j<lines.length; j++){ 83 for(var k=j+1; k<lines.length-j-1; k++){ 84 if(lineFirstChars[j] == lineFirstChars[k]){ 85 rightArray.push(lines[k]); 86 lines.splice(k, 1); 87 k--; 88 } 89 } 90 } 91 92 var text2 = ""; 93 for(var i=0; i<lines.length; i++){ 94 $('.box').text(lines[i]); 95 var text =$('.box').text().replace(/\"],/g,'\"],\n'); 96 text2 = text2 + text; 97 } 98 $('#output').text(text2); 99 100 var text4 = ""; 101 for(var i=0; i<rightArray.length; i++){ 102 $('.box2').text(rightArray[i]); 103 var text3 =$('.box2').text().replace(/\"],/g,'\"],\n'); 104 text4 = text4 + text3; 105 } 106 $('#output2').text(text4); 107 }); 108 })(); 109 </script> 110</body> 111</html>
この辺が間違っている気がしています。
javascript
1 for(var j=0; j<lines.length; j++){ 2 for(var k=j+1; k<lines.length-j-1; k++){ 3 if(lineFirstChars[j] == lineFirstChars[k]){ 4 rightArray.push(lines[k]); 5 lines.splice(k, 1); 6 k--; 7 } 8 }
ifが満たされた時に
spliceを使うことで、配列linesの要素数が減り、その影響で、for文の挙動が少しおかしくなり、なんらかのkが飛ばされているのではないかと思っています。
sliceの他にdeleteして
$.grep(hoge, function(e){return e !== "";});
を実行してみたりしたのですが、上手く行きませんでした。
データの形式は、配列の形です。
例として、以下のサイトにデータを置いておきます。
http://marumaru.tonkotsu.jp/%E6%9C%80%E5%88%9D%E3%81%8B%E3%82%89n%E6%96%87%E5%AD%97%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E8%A1%8C%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0
「var jouhou=」以下をまるまるコピペしてテキストエリアにぶちこんで変換を押しても上手く行ってないことがわかります。
何でこんなことをしたいのかというと、この4つの配列の[n][0]の英数字の羅列が授業コードなのですが、これの重複を防ぎたいのです。
ところが授業コードが同じにも関わらず[n][8]のリンクの最後の英数字が異なるので、
「行重複削除ツール」なるものがネット上にあるのですが、行がまるまる一致しているわけではないので、それが使えないのです。
どなたか間違いがわかる方がいらっしゃればご教授願います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。