2016-07-19 13 views
-2

私はJavaScriptで働いている、と私はこのような二つの文字列いますこのように2つの文字列を比較するにはどうすればよいですか?

var week1="1.345.7", // each digit refers to one day of the week 
    week2="123..6."; 

今、私は共通の日数を意味している1から7まで値を戻したいです。

上記の例では、2つの週に月曜日と水曜日(1と3)があるため、2を返す必要があります。

上記をどのように達成できますか?

+6

それはあなたが –

+0

Iドンをタグ付けしている言語であると私はjavascriptの、おそらく、いくつかのコードを使用します: –

+1

これをより小さな管理可能なステップに分割します。1.文字列を日数の配列に分割します。2.両方の配列で共通の数字を探します。あなたが立ち往生するたびに、タスクを小さなものに分解します。あなたはそれを次々と管理し、解決することができます。 – zerkms

答えて

0

ちょうど別のオプションをスローしますそこに空の文字列引数で文字列を分割すると、1文字の文字列の配列が得られます。これにより、繰り返しが容易になりますが、ECMAscript 5.1(特にIE 9以上)をサポートしているブラウザをターゲットにしている場合は、の機能を使用することもできます()。一般的には、配列を渡して反復して単一の値を返すときに適しています。これはもっと簡潔になるかもしれませんが、私はそれがこの方法に従う方が簡単だと思います。

var week1="1.345.7"; 
 
var week2="123..6."; 
 

 
function weekDaysInCommon(w1, w2) { 
 
    //split to convert w1 to an array. 
 
    //"1.345.7" becomes ["1", ".", "3", "4", "5", ".", "7"] 
 
    w1 = w1.split(''); 
 
    //countCharactersAtSameIndex(w2) returns the function to use as the callback, with w2 accessible to it via closure 
 
    //the second arg, 0, is the initial value. 
 
    return w1.reduce(countCharactersAtSameIndex(w2), 0); 
 
} 
 

 
function countCharactersAtSameIndex(comparisonWeek) { 
 
    comparisonWeek = comparisonWeek.split(''); 
 
    return function(total, day, index) { 
 
    if(comparisonWeek[index] === day) { 
 
     return total + 1; 
 
    } else { 
 
     return total; 
 
    } 
 
    } 
 
} 
 

 
document.write(weekDaysInCommon(week1, week2) + ' days in common');

さらに読書: MDNが軽減機能に優れたドキュメントを持っている - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

4

各文字は.またはそのインデックスであるため、少しでもそれを表すことができます。

"0b" + "1.345.7".replace(/./g, c=>c==='.'?0:1); // "0b1011101" 
"0b" + "123..6.".replace(/./g, c=>c==='.'?0:1); // "0b1110010" 

次に、あなたはビット演算子のAND &を使用することができます。

"0b1011101" 
& "0b1110010"; 
// 0b1010000 

は最後に、あなただけ戻って文字列に変換し、1の数をカウントする必要があります。

0b1010000.toString(2).split('1').length-1; // 2 

おそらく私はこれのようにはしませんが、楽しみのためだけです:)


実際には、より少ないメモリを無駄にし、あなたは数字の代わりに文字列

0b1011101; // 93 - only needs 64 bits! 
0b1110010; // 114 - only needs 64 bits! 

としてデータを保存でき、

0b1011101 >> 6 & 1; // 1 - 1st bit 
0b1011101 >> 5 & 1; // 0 - 2nd bit 
0b1011101 >> 4 & 1; // 1 - 3rd bit 
0b1011101 >> 3 & 1; // 1 - 4th bit 
0b1011101 >> 2 & 1; // 1 - 5th bit 
0b1011101 >> 1 & 1; // 0 - 6th bit 
0b1011101 >> 0 & 1; // 1 - 7th bit 
+0

downvoterは楽しい:(downvoterはおそらく一週間以上64日に一般的に使用されるカレンダーシステムが存在すると考えている – Oriol

+1

嫌い:D – slebetman

+1

@slebetmanを実際に32 – zerkms

1

データを取得するために、最初の文字列から数字のリストを取得します。クイック正規表現を使用して、それをフィルタリングして、他の1つのものだけを残してから、lengthの数を確認します。

「コードゴルフ」の精神で
(week1.match(/\d/g) || []) . filter(n => week2.includes(n)) . length 

、あなたは文字列の文字間のループにfor...ofの能力を利用して、発電機としてこれを書くことができます:

function *common(a, b) { 
    for (c of a) if (c !== '.' && b.includes(c)) yield c; 
} 

console.log(...common(a, b)) 
関連する問題