タイトル通り 最初のn文字が一致する行を削除するプログラムをjavascriptと必要であればjQueryを用いて作成したいと思っています。
http://txt.3m3g.com/
ココに似たようなものがあるのですが、これは行の完全一致の場合、重複行を削除します。
しかし今回はそれでは問題があるので、最初のn文字が重複する時に、その重複行を削除したいのです。
取り掛かろうと思ったのですが、早速躓いてしまったので、
ヒントか回答例を提示していただけないでしょうか。
よろしくお願いします。
goufさんの回答を参考に作ってみました。
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 .button { 22 width: 100px; 23 font-size: 20px; 24 background-color: #333; 25 border: 2px solid #333; 26 color: #fff; 27 line-height: 50px; 28 transition: all .3s; 29 } 30 .button:hover { 31 background-color: #fff; 32 border-color: #1abc9c; 33 color: #1abc9c; 34 } 35 .box,.box2 { 36 display: none; 37 } 38</style> 39<body> 40 <div><textarea id="input" cols="100" rows="40"></textarea></div> 41 <div><input class="button" type="button" value="変 換"></div> 42 <textarea id="output" cols="100" rows="40"></textarea> 43 <textarea id="output2" cols="100" rows="40"></textarea> 44 <div class="box"></div> 45 <div class="box2"></div> 46 47 <script> 48 (function(){ 49 'use strict'; 50 function firstThreeChars(elm) { 51 // 配列をmap で回して index 指定値として利用 52 // 文字列から最初の13字を抜き出す 53 return Array.apply(null, Array(13)).map(function(_, i) { 54 return elm[i]; 55 }).join(''); 56 } 57 58 function rejectDup(elements) { 59 // もともとの文字列に加えて 重複しているか否かを判定できるよう設定値を追加 60 var obj = elements.map(function(elm) { 61 return { 62 str: elm, 63 firstThreeChars: firstThreeChars(elm), 64 duplicated: false 65 } 66 }); 67 // 素朴に2重ループで重複検出 68 for(var i = 0; i < obj.length; i++) { 69 for(var j = 0; j < obj.length; j++) { 70 var duplicated = (obj[i].firstThreeChars == obj[j].firstThreeChars); 71 var sameIndex = (i == j); 72 if(!sameIndex && duplicated) { 73 obj[i].duplicated = true 74 } 75 } 76 } 77 78 // 重複していないものだけを結果として返却 79 return obj.reduce(function(ret, elm) { 80 if(elm.duplicated == false) { 81 ret.push(elm.str); 82 } 83 return ret; 84 }, []); 85 } 86 87 function rejectDup2(elements) { 88 // もともとの文字列に加えて 重複しているか否かを判定できるよう設定値を追加 89 var obj = elements.map(function(elm) { 90 return { 91 str: elm, 92 firstThreeChars: firstThreeChars(elm), 93 duplicated: false 94 } 95 }); 96 // 素朴に2重ループで重複検出 97 for(var i = 0; i < obj.length; i++) { 98 for(var j = 0; j < obj.length; j++) { 99 var duplicated = (obj[i].firstThreeChars == obj[j].firstThreeChars); 100 var sameIndex = (i == j); 101 if(!sameIndex && duplicated) { 102 obj[i].duplicated = true 103 } 104 } 105 } 106 107 return obj.reduce(function(bad, elm) { 108 if(elm.duplicated == true) { 109 bad.push(elm.str); 110 } 111 return bad; 112 }, []); 113 } 114 115 116 117 $('.button').click(function(){ 118 var str = $('#input').val(); 119 120 var result = rejectDup(str.split("\n")); 121 $('.box').text(result); 122 var box = $('.box').text(); 123 $('#output').html(box.replace(/\"],/g, '\"],\n')); 124 125 var result2 = rejectDup2(str.split("\n")); 126 $('.box2').text(result2); 127 var box2 = $('.box2').text(); 128 $('#output2').html(box2.replace(/\"],/g, '\"],\n')); 129 130 }); 131 132 })(); 133 </script> 134</body> 135</html>
こんな風に、前13文字が重複しているものは右側のテキストエリアに、重複していないものは左側のテキストエリアに表示するようにしたのですが、望んでいるものは、例えば
(n =1とします)
1
2
2
2
3
3
と入力すれば,
1
2
3
となるように重複を除くけど、1つは残すようにしたいのです。
そして入力するデータは
["A310050015",4,2,"name","subject","room","http://ssss.com=1"],
["A310050015",4,2,"name","subject","room","http://ssss.com=2"]
..
のような形式なのですが、左側のコード等が同じなのに、右端のURLの値が僅かに違うので、こういうものを作りたいと思っています。
データの1行1行が配列なのでreplace(/"],/g, '"],\n')などを使っています。
アドバイスよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー