2016-07-19 16 views
-2

Ich arbeite mit JavaScript, und ich habe zwei Strings wie folgt aus:Wie zwei Strings auf diese Weise zu vergleichen?

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

Jetzt möchte ich einen Wert von 1 bis 7 zurück, die gemeinsam mit der Anzahl der Tage bezieht.

Im vorherigen Beispiel sollte ich 2 zurückgeben, weil wir beide Wochen Montag und Mittwoch haben (1 und 3).

Wie kann ich das oben genannte erreichen?

+6

ich einige Code verwenden würde, wahrscheinlich Javascript wie das ist die Sprache, die Sie –

+0

I don getaggt weiß nicht, wie es weitergeht ..: s –

+1

Teilen Sie es in kleinere verwaltbare Schritte: 1. Teilen Sie eine Zeichenfolge in ein Array von Tagen, die auf 2 gesetzt sind. Suchen Sie, welche Zahlen in beiden Arrays gemeinsam sind.Jedes Mal, wenn Sie stecken - zerlegen Sie eine Aufgabe in kleinere Aufgaben, die Sie bewältigen und nacheinander lösen können. – zerkms

Antwort

0

einfach eine andere Option werfen da draußen, wenn Sie eine Zeichenfolge mit einem leeren String-Argument teilen, erhalten Sie ein Array von ein Zeichen langen Strings. Dies macht es einfach zu iterieren, aber wenn Sie Browser mit ECMAscript 5.1 (vor allem IE 9+) als Ziel haben, können Sie die Funktion reduce verwenden. Es passt im Allgemeinen gut, wenn Sie ein Array übergeben, das Sie durchlaufen möchten, und einen einzelnen Wert zurückgeben. Das könnte prägnanter sein, aber ich denke, es ist einfacher, auf diese Weise zu folgen.

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');

Weiterführende Literatur: MDN hat eine gute doc auf die Verringerung Funktion - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

4

Jedes Zeichen ist entweder . oder sein Index, so dass Sie es mit einem Bit darstellen können.

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

Dann können Sie die Bit-Operatoren AND & verwenden:

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

Schließlich Sie es nur in String zurück konvertieren müssen und die Anzahl der 1 zählen:

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

Wahrscheinlich würde ich es nicht so machen, aber nur zum Spaß :)


In der Tat, weniger Speicher zu verschwenden, können Sie die Daten als Zahlen speichern, anstatt von Strings

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

Und die Daten

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

Der Downvoter hasst Spaß :( – Oriol

+1

Der Downvoter glaubt wahrscheinlich, dass es ein allgemein verwendetes Kalendersystem mit mehr als 64 Tagen in einer Woche gibt: D – slebetman

+1

@slebetman eigentlich 32. – zerkms

1

Hier finden Sie eine Liste der Stellen von der ersten Zeichenfolge abrufen Verwenden Sie eine schnelle Regexp, dann filtern Sie es, um nur diejenigen, die in der anderen sind, dann sehen, wie viele es mit length sind.

(week1.match(/\d/g) || []) . filter(n => week2.includes(n)) . length 

In einem "Code Golf" Geist, könnte man dies als Generator schreiben, in einem String in Zeichen Vorteil der Fähigkeit von for...of Schleife unter:

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

console.log(...common(a, b)) 
Verwandte Themen