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

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

ただいまの
回答率

89.99%

javascriptで文字列を厳密に比較したいです。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,237

abouch

score 13

前提・実現したいこと

javascriptで文字列?(正確な言い回しができませんが)を厳密に比較したいです。
例えば以下のような二つの変数があるとします。 
var   anser="123456789"
var myAnser="120456009"

myAnserをanserを基準として比較すると
anserの3,7,8の部分がmyAnserでは0になっています。
このことを(myAnserの2番目6番目7番目がanserと違いますよと)教えてくれるメソットはありますか?
ご存知の方いらっしゃいましたら教えてください。

(補足)
簡単な数字記憶ゲームやタイピングゲームで、入力した答えが間違っていた時
(正解と比較して)その間違った部分を色を変えるなどして視覚化して表示させたいです。

(追記)
以下のように落ち着きました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
  <p>anser = 123456789</p>
  <p id=ans><span>myAnser = </span>
  </p>
<script>
var   anser="123456789";
var myAnser="120456009";

function createSpan(i){
  var spanA=document.createElement('span')
  var spanB=document.createElement('span')
      spanA.id="correct"+i
      spanB.id="incorrect"+i
      spanB.style.color='deeppink'
      document.getElementById('ans').appendChild(spanA)
      document.getElementById('ans').appendChild(spanB)
}
function my_diff(a,b){
for(var i=0;i<9;i++){
  if(a.charAt(i) === b.charAt(i)){
  document.getElementById('correct'+i).innerHTML=b.charAt(i)
}else{
  document.getElementById('incorrect'+i).innerHTML=b.charAt(i)
}}};

for(var i=0;i<9;i++){
createSpan(i);
}
my_diff(anser,myAnser);



</script>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+4

そんなメソッドはありませんので、ご自身で作成されてはいかがでしょうか。

function my_diff(a, b) {
  var array = [];
  var len = a.length;
  for (i = 0; i < len; i++) {
    if (a.charAt(i) != b.charAt(i)) {
      array.push(i);
    }
  }
  return array;
}

var   anser="123456789";
var myAnser="120456009";

var result = my_diff(anser, myAnser);
alert(result);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/17 14:07

    完全に甘えた質問でした。
    回答ありがとうございます。
    先に進めそうです

    キャンセル

+1

文字列なので1文字ずつ取り出して比べればよいのでは?

var   anser="123456789"
var myAnser="120456009"
for(var i=1;i<=anser.length;i++){
  if(anser.substr(i-1,1)!=myAnser.substr(i-1,1)){
    console.log(i+":"+anser.substr(i-1,1)+"-"+myAnser.substr(i-1,1));
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/17 14:06

    回答ありがとうございます。
    一つ一つ比べてみます。

    キャンセル

0

lodash の _.difference をつかえば可能です.

console.log(_.difference('123456789'.split(''), '120456009'.split('')));

// ["3", "7", "8"]

lodash: https://lodash.com/docs/4.16.4

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/17 13:24

    lodashは初めてしりました。色々あるんですね。
    ただ、churabouさんの意図している動きと違うようです。

    console.log(_.difference('ZZZZZZZZZ'.split(''), '120456009'.split('')));
    // ["Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z"]

    キャンセル

  • 2016/10/17 13:31 編集

    質問の理解が足りていませんでした.補足ありがとうございます.全く違うものを比較するとすべて異なるので 第1引数がすべて表示されますね.
    差集合をとっているだけなので.

    ただ,
    ```
    (補足)
    簡単な数字記憶ゲームやタイピングゲームで、入力した答えが間違っていた時
    (正解と比較して)その間違った部分を色を変えるなどして視覚化して表示させたいです。
    ```
    という要求を満たすにはこれが一番スマートだと思います.

    キャンセル

  • 2016/10/17 14:09

    回答ありがとうございます。
    こうゆうものを知りたかったです

    キャンセル

0

配列用のメソッドを利用すると下記のように実装できます。
返り値の配列のlengthが1以上なら間違いということになり、0であれば正解となります。

var ans = '123456789';
var myAns = '120456009';

var correctAnswer = function(ans, myAns) {
  var arrAns = ans.split(''),
    arrMyAns = myAns.split(''),
    diff = arrMyAns.map(function(item, index) {
      if (item !== arrAns[index]) {
        return index;
      }
      return false;
    }).filter(function(item) {
      return typeof item === 'number';
    });
  return diff;
};

// 一部間違い
console.log(correctAnswer(ans, myAns)); // [2, 6, 7]

// 全部間違い
console.log(correctAnswer('hoge', myAns)); // [0, 1, 2, 3, 4, 5, 6, 7, 8]

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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