2016-07-31 6 views
2

Ich habe Probleme, meine Lösung in die "Jaden Casing Strings" -Katas auf Codewars zu re-factory. Das Problem ist, den ersten Buchstaben jedes Wortes eines bestimmten Satz zu nutzen, wie folgt aus:Verwenden von reduce() beim Definieren neuer String-Methoden

Nicht Jaden Gefasste: „Wie kann Spiegel real sein, wenn unsere Augen nicht real sind“

Jaden Gefasste: „Wie kann Mirrors Be Real Wenn unsere Augen nicht real sind“

Hier ist meine Lösung ist:

function jayden (sen) { 
    sen = sen.split('').reduce(function (str, next, ind) { 
    return str + (!sen[ind - 1] || sen[ind - 1] === ' ' ? next.toUpperCase() : next); 
    }, ''); 
    return sen 
} 

String.prototype.toJadenCase = function() { 
    return jayden(this) 
} 

im Idealfall würde ich mag den Inhalt der jayden Funktion haben, innerhalb von String.prototype.toJadenCase = function() { aber ich kann nicht scheinen durchzu iterieren. Ist es möglich, durch this zu iterieren?

+1

Ich weiß, dass dies nur für eine kleine Kata ist, aber Sie sollten den Prototyp nie wirklich bearbeiten. Erstellen Sie entweder eigene, die "String" erben, oder verwenden Sie einfach die von Ihnen erstellte benannte Funktion. Wenn Sie mit anderen Leuten arbeiten, stellt es Anwendungen für eine Welt der Schmerzen bereit, wenn jeder anfängt, zu den Prototypen von Primitiven hinzuzufügen, was sie wollen: 'String.prototype.toUpperCase = function() {return" GOT YOU GOOD !!!! " } ' – cdbajorin

+1

In einer Methode für' String.prototype' ist 'this' die Zeichenfolge, und Sie können alles tun, was Sie mit einer Zeichenfolge tun könnten. Was funktioniert nicht für dich? –

+0

@torazaburo Nach dem Lesen Ihres Kommentars erkannte ich den Fehler, den ich in erster Linie gemacht habe. Ich habe versucht, durch "this" zu iterieren, als wäre es 'this.split ('')', das ein Array von Strings statt einer Zeichenkette ist. Vielen Dank! –

Antwort

1

Hier ist, wie Sie es tun könnte, auf einfachere Art und Weise:

String.prototype.toJadenCase = function() { 
 
    return this.split(" ").map(function(x){ 
 
     return x[0].toUpperCase()+x.slice(1); 
 
    }).join(" "); 
 
} 
 
console.log("How can mirrors be real if our eyes aren't real".toJadenCase())

Ein anderes Beispiel mit reduce():

String.prototype.toJadenCase = function() { 
 
    return this.split('').reduce(function (str, next, index) { 
 
    return str+(str[index-1]==" "?next.toUpperCase():next)   
 
    }); 
 
} 
 
console.log("How can mirrors be real if our eyes aren't real".toJadenCase())

Wie funktioniert das zweite Beispiel:

Jedes Mal str ist der aktuelle Teil der Zeichenfolge ohne ein letztes Zeichen. Das letzte Zeichen ist next. Hier ist die Aufteilung, wie str und next mit jeder Iteration ändern. Vor dem Komma ist str, danach ist next.

H,o 
    Ho,w 
    How, 
    How ,c 
    How C,a 
    How Ca,n 
    How Can, 
    How Can ,m 
    How Can M,i 
    How Can Mi,r 
    How Can Mir,r 
    How Can Mirr,o 
    How Can Mirro,r 
    How Can Mirror,s 
    How Can Mirrors, 
    How Can Mirrors ,b 
    How Can Mirrors B,e 
    How Can Mirrors Be, 

Die Logik ist: return str + nächstes wird, wenn str mit einem Zwischenraum endet nicht (d.h. str[index-1], die das letzte Zeichen ist, ein Raum ist). Wenn str mit einem Leerzeichen endet, dann ist next der erste Buchstabe der neuen Zeichenfolge. Dann ist es groß geschrieben. Also, in diesem Fall sind wir Rückkehr str+next.toUpperCase()

+0

Danke.Ich bin ein Anfänger bei Javascript und ich schrieb es so, wie ich es tat, ich konnte üben mit reduzieren.Sie wissen, ob es wäre möglich, dies zu schreiben, indem man reduziert? –

+1

@ Jeremy Ein anderes Beispiel hinzugefügt, jetzt mit '.reduce()'. – nicael

+0

Das ist eine furchtbare Menge von Verbreitung und Popping. Wäre es nicht klarer, es als 'reduzieren (Funktion (str, next, i, orig) {zurück str + (orig [i-1] === ""? next.toUpperCase(): next); " –

0

, dass diese einfache Art und Weise funktioniert:

var str = "How can mirrors be real if our eyes aren't real"; 
var jayden = str.split(" ").map(x => x[0].toUpperCase().concat(x.slice(1))).join(" "); 

console.log(jayden); // How Can Mirrors Be Real If Our Eyes Aren't Real 
+0

Seine Frage bezieht sich darauf, wie man dies auf den 'String'-Prototypen bringt. –

0

Ähnlich wie Ihre Frage, zurückgeben eine sofort anonyme Funktion aufgerufen, anstatt eine benannte Funktion aufgerufen wird:

String.prototype.toJadenCase = function() { 
 
    return function (sen) { 
 
    return sen.split('').reduce(function (str, next, ind) { 
 
     return str + (!sen[ind - 1] || sen[ind - 1] === ' ' ? next.toUpperCase() : next); 
 
    }, ''); 
 
    }(this); 
 
}; 
 

 
console.log("How can mirrors be real if our eyes aren't real".toJadenCase());

+0

Warum ist das notwendig? –

+0

@torazaburo Ja, nicht notwendig. Ich beantworte die Frage Punkte: "Problem Re-Factoring" und "die Inhalte der Jayden-Funktion innerhalb ... Prototyp ...". – bloodyKnuckles

0

Wenn Sie wollen immer noch die Logik für toJadenCase von der Str isolieren In dem Prototyp können Sie auf die Methode toJadenCase bis this verweisen und dann den Wert this aus dem String-Prototyp ändern. Wie ...

function jayden() { 
 
    var self = this; 
 
    self = self.split('').reduce(function (str, next, ind) { 
 
    return str + (!self[ind - 1] || self[ind - 1] === ' ' ? next.toUpperCase() : next); 
 
    }, ''); 
 
    return self; 
 
}

Und dann definieren toJadenCase in String-Prototyp als ...

String.prototype.toJadenCase = function() { 
 
    return jayden.call(this); 
 
};

Überprüfen Sie die Konsole dieses JS Bin example.

1

Ich verstehe nicht, warum einige Leute versuchen, Code zu schreiben, die zur globalen Erwärmung beitragen.

String.prototype.toJadenCase = function(s) { 
    s=s||this; 
    var a = s.split(" "), i=0; 
    while(a[i])a[i]=a[i].replace(a[i][0],a[i++][0].toUpperCase()); 
     return a.join(" "); 
} 

können beide Arten verwendet werden, für eine Zeichenfolge wie:
var str = "How can mirrors be real if our eyes aren't real" Sie gehen können:

str.toJadenCase();

aber nicht beschränkt auf, bei Bedarf und wenn die alternative

benötigt

"".toJadenCase(str);

wird verfügbar sein.

+0

Können Sie den Kommentar zur globalen Erwärmung erklären? Liegt es daran, dass einige Funktionen ineffizient sind? –

+0

ja, in den meisten von ihnen, wie Sie sehen können, verwenden Sie übermäßigen Verarbeitungsaufwand oder mindestens 10 mal größer als notwendig; Einer von ihnen schreibt und überschreibt jedes einzelne Bit des String-Inhalts im Prozess der Aktivierung von wenigen Anfangsbuchstaben. –

Verwandte Themen