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

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

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

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

jQuery

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

Q&A

解決済

2回答

2799閲覧

最初からn文字が一致する行を削除するプログラムが上手く動かない

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2017/04/19 15:26

編集2017/04/19 16:05

入力した数字を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]のリンクの最後の英数字が異なるので、
「行重複削除ツール」なるものがネット上にあるのですが、行がまるまる一致しているわけではないので、それが使えないのです。

どなたか間違いがわかる方がいらっしゃればご教授願います。

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

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

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

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

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

guest

回答2

0

未検証ですが。

JavaScript

1function findUniqueLine (string, startWidth) { 2 return string.split(/\r\n|[\n\r]/).filter(function (line) { 3 var startString = line.slice(0, startWidth); 4 5 if (this.indexOf(startString) !== -1) { 6 return false; 7 } 8 9 this.push(startString); 10 return true; 11 }, []);; 12}

投稿2017/04/19 23:50

think49

総合スコア18156

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

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

0

ベストアンサー

こんな感じでいけるかな?

HTML

1<div> 2 <span>最初からn文字が一致する行を削除.</span> 3 <input type="text" id="inputNum" value="2"> 4</div> 5<div><textarea id="input" cols="100" rows="40">12345 6123896 7158746 8115586 915786x 10123546 11887764 12</textarea></div> 13<div><input id="button" type="button" value="変 換"></div> 14<textarea id="output" cols="100" rows="40"></textarea> 15<textarea id="output2" cols="100" rows="40"></textarea> 16<div class="box"></div> 17<div class="box2"></div>

JavaScript

1jQuery( function() { 2 'use strict'; 3 $( '#button' ).click( function() { 4 const lines = $( '#input' ).val().replace( /\r\n|\r/g, '\n' ).split( '\n' ); //line配列に格納 5 const firstNChars = parseInt( $( '#inputNum' ).val(), 10 ); 6 let lineFirstChars = []; //先頭n文字の配列 7 let resultArray = []; // 結果 8 let deleteItems = []; // 削除したもの 9 10 for ( let i = 0; i < lines.length; i++ ) { 11 lineFirstChars.push( lines[ i ].slice( 0, firstNChars ) ); //先頭n文字の配列 12 } 13 14 for ( let j = 0, l = lineFirstChars.length; j < l; j++ ) { 15 let item = lineFirstChars[ j ], flag = true; 16 for ( let k = j - 1; k >= 0; k-- ) { // jより前に重複が無いか探索 17 if ( item == lineFirstChars[ k ] ) { 18 deleteItems.push( lines[ j ] ); 19 flag = false; // 結果から除外 20 break; 21 } 22 } 23 if ( flag && lines[ j ] ) { // 重複と空行を除外 24 resultArray.push( lines[ j ] ); // 結果に追加 25 } 26 } 27 $( '#output' ).val( resultArray.join( '\n' ) ); 28 $( '#output2' ).val( deleteItems.join( '\n' ) ); 29 $( '.box' ).html( resultArray.join( '<br>' ) ); 30 $( '.box2' ).html( deleteItems.join( '<br>' ) ); 31 } ); 32} ); 33```**動くサンプル:**[https://jsfiddle.net/xjkrxdtp/1/](https://jsfiddle.net/xjkrxdtp/1/)

投稿2017/04/19 17:17

kei344

総合スコア69366

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問