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

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

ただいまの
回答率

90.47%

  • JavaScript

    20947questions

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

  • jQuery

    8341questions

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

最初のn文字が一致する行を削除するプログラム

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 584

cloudspider

score 80

タイトル通り 最初のn文字が一致する行を削除するプログラムをjavascriptと必要であればjQueryを用いて作成したいと思っています。

http://txt.3m3g.com/
ココに似たようなものがあるのですが、これは行の完全一致の場合、重複行を削除します。
しかし今回はそれでは問題があるので、最初のn文字が重複する時に、その重複行を削除したいのです。
取り掛かろうと思ったのですが、早速躓いてしまったので、
ヒントか回答例を提示していただけないでしょうか。

よろしくお願いします。

goufさんの回答を参考に作ってみました。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <title>pasword generator</title>
</head>
<style>
  textarea {
    outline: none;
    border: 1px solid #aaa;
    -webkit-transition: all .3s;
    transition: all .3s;
  }
  textarea:focus {
    box-shadow: 0 0 7px #1abc9c;
    border: 1px solid #1abc9c;
  }
  .button {
    width: 100px;
    font-size: 20px;
    background-color: #333;
    border: 2px solid #333;
    color: #fff;
    line-height: 50px;
    transition: all .3s;
  }
  .button:hover {
    background-color: #fff;
    border-color: #1abc9c;
    color: #1abc9c;
  }
  .box,.box2 {
    display: none;
  }
</style>
<body>
  <div><textarea id="input" cols="100" rows="40"></textarea></div>
  <div><input class="button" type="button" value="変 換"></div>
  <textarea id="output" cols="100" rows="40"></textarea>
  <textarea id="output2" cols="100" rows="40"></textarea>
  <div class="box"></div>
  <div class="box2"></div>

  <script>
  (function(){
    'use strict';
    function firstThreeChars(elm) {
      // 配列をmap で回して index 指定値として利用
      // 文字列から最初の13字を抜き出す
      return Array.apply(null, Array(13)).map(function(_, i) {
         return elm[i];
       }).join('');
    }

    function rejectDup(elements) {
      // もともとの文字列に加えて 重複しているか否かを判定できるよう設定値を追加
      var obj = elements.map(function(elm) {
        return {
          str: elm,
          firstThreeChars: firstThreeChars(elm),
          duplicated: false
        }
      });
      // 素朴に2重ループで重複検出
      for(var i = 0; i < obj.length; i++) {
        for(var j = 0; j < obj.length; j++) {
          var duplicated = (obj[i].firstThreeChars == obj[j].firstThreeChars);
          var sameIndex = (i == j);
          if(!sameIndex && duplicated) {
            obj[i].duplicated = true
          }
        }
      }

      // 重複していないものだけを結果として返却
      return obj.reduce(function(ret, elm) {
        if(elm.duplicated == false) {
          ret.push(elm.str);
        }
        return ret;
      }, []);
    }

    function rejectDup2(elements) {
      // もともとの文字列に加えて 重複しているか否かを判定できるよう設定値を追加
      var obj = elements.map(function(elm) {
        return {
          str: elm,
          firstThreeChars: firstThreeChars(elm),
          duplicated: false
        }
      });
      // 素朴に2重ループで重複検出
      for(var i = 0; i < obj.length; i++) {
        for(var j = 0; j < obj.length; j++) {
          var duplicated = (obj[i].firstThreeChars == obj[j].firstThreeChars);
          var sameIndex = (i == j);
          if(!sameIndex && duplicated) {
            obj[i].duplicated = true
          }
        }
      }

      return obj.reduce(function(bad, elm) {
        if(elm.duplicated == true) {
          bad.push(elm.str);
        }
        return bad;
      }, []);
    }



    $('.button').click(function(){
      var str = $('#input').val();

      var result = rejectDup(str.split("\n"));
      $('.box').text(result);
      var box = $('.box').text();
      $('#output').html(box.replace(/\"],/g, '\"],\n'));

      var result2 = rejectDup2(str.split("\n"));
      $('.box2').text(result2);
      var box2 = $('.box2').text();
      $('#output2').html(box2.replace(/\"],/g, '\"],\n'));

    });

  })();
  </script>
</body>
</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')などを使っています。

アドバイスよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/04/13 01:44

    ご自身で書かれたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが解決につながると思います。

    キャンセル

  • 退会済みユーザー

    2017/04/13 07:52

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • yambejp

    2017/04/13 09:17

    プログラム上n文字とは0文字も含むため、n文字の提供の仕方を書かない限り2行目以降全行削除になります

    キャンセル

  • cloudspider

    2017/04/13 12:14

    補足しました。よろしくお願いします。

    キャンセル

回答 2

+4

丸投げではなく、ヒントが欲しいとの事だったのでこの辺の関数を使えば実装できそうですね。
分かっている部分をコードで書き表すとより良い質問になると思います。

Re: cloudspider さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

  • 文字列は配列と同様、インデックスを指定できる
  • Array.apply() でサイズとインデックス値を対応させた配列が生成できる
  • ループ処理で配列内の値を比較できる
  • Array.prototype.reduce() で重複排除できる

といったことが可能であれば、以下のように書くことが出来るのではないでしょうか

function firstThreeChars(elm) {
  // 配列の生成 [0, 1, 2]
  // 配列をmap で回して index 指定値として利用
  // 文字列から最初の3字を抜き出す
  return Array.apply(null, Array(3))
    .map(function(_, i) { return elm[i] }).join('') 
}

function rejectDup(elements) {
  // もともとの文字列に加えて 重複しているか否かを判定できるよう設定値を追加
  var obj = elements.map(function(elm) { return {str: elm, firstThreeChars: firstThreeChars(elm), duplicated: false} })

  // 素朴に2重ループで重複検出
  for(var i = 0; i < obj.length; i++) {
    for(var j = 0; j < obj.length; j++) {
      var duplicated = (obj[i].firstThreeChars == obj[j].firstThreeChars)
      var sameIndex = (i == j)
      if(!sameIndex && duplicated) { obj[i].duplicated = true }
    }
  }

  // 重複していないものだけを結果として返却
  return obj.reduce(function(ret, elm) {
    if(elm.duplicated == false) { ret.push(elm.str) }
    return ret
  }, [])
}

var str = `foo
bar
bool
barbar
foooo!
たろう
たろうまる`

var result = rejectDup(str.split("\n"))
console.log(result) // => [ 'bool' ]

何か参考になれば幸いです

 Link

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/13 12:15

    回答ありがとうございました。
    参考にさせていただき作ってみました。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    20947questions

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

  • jQuery

    8341questions

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