ฉันจะใช้อักษรตัวพิมพ์ใหญ่ตัวแรกของแต่ละคำในสตริงโดยใช้ JavaScript ได้อย่างไร


117

ฉันกำลังพยายามเขียนฟังก์ชันที่ใช้อักษรตัวแรกของทุกคำในสตริงเป็นตัวพิมพ์ใหญ่ (การแปลงสตริงเป็นตัวพิมพ์ใหญ่)

ตัวอย่างเช่นเมื่ออินพุตเป็น"I'm a little tea pot"ฉันคาดว่า"I'm A Little Tea Pot"จะเป็นเอาต์พุต "i'm a little tea pot"แต่ผลตอบแทนที่ได้ฟังก์ชั่น

นี่คือรหัสของฉัน:

function titleCase(str) {
  var splitStr = str.toLowerCase().split(" ");

  for (var i = 0; i < splitStr.length; i++) {
    if (splitStr.length[i] < splitStr.length) {
      splitStr[i].charAt(0).toUpperCase();
    }

    str = splitStr.join(" ");
  }

  return str;
}

console.log(titleCase("I'm a little tea pot"));


ดูเหมือนว่าจะไม่ใช้อักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ หรือคุณหมายความว่าคุณต้องการใช้ตัวพิมพ์ใหญ่แต่ละคำที่มีอยู่ในสตริง
epascarello

2
คุณยังไม่ได้ assigining โครงสร้างเงินทุนของคุณเพื่อผลของคุณเป็นไปได้splitStr[i].charAt(0).toUpperCase(); voidคุณต้องทำsplitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1);
บางอย่างที่นี่

1
คุณควรบอกเราก่อน อะไรคือผิดปกติกับฟังก์ชั่นที่? ผลลัพธ์ที่คาดหวังคืออะไรและสิ่งที่ส่งกลับมาแทน?
Sebastian Simon

ฟังก์ชันนี้ดูเหมือนว่าจะพยายามใช้อักษรตัวแรกของทุกคำเป็นตัวพิมพ์ใหญ่
Halcyon

3
อย่างที่ชื่อบอกฉันพยายามใช้อักษรตัวแรกของแต่ละคำในสตริงเป็นตัวพิมพ์ใหญ่ ฉันไม่เห็นคุณค่าของการโหวตลดหรือการปฏิเสธในฟอรัมที่ควรจะสนับสนุนโดยธรรมชาติ @somethinghere - ขอบคุณสำหรับการตอบกลับ
slurrr

คำตอบ:


166

คุณไม่ได้กำหนดการเปลี่ยนแปลงของคุณให้กับอาร์เรย์อีกดังนั้นความพยายามทั้งหมดของคุณจึงไร้ผล ลองสิ่งนี้:

function titleCase(str) {
   var splitStr = str.toLowerCase().split(' ');
   for (var i = 0; i < splitStr.length; i++) {
       // You do not need to check if i is larger than splitStr length, as your for does that for you
       // Assign it back to the array
       splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1);     
   }
   // Directly return the joined string
   return splitStr.join(' '); 
}

document.write(titleCase("I'm a little tea pot"));


@ Halcyon นั่นจะทำให้ได้ตัวอักษรหนึ่งตัวสำหรับแต่ละคำ
epascarello

15
ใน es6 คุณสามารถทำได้ซึ่งดูดีกว่าเล็กน้อย:myStr.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1)).join(' ');
Patrick Michaelsen

1
@PatrickMichaelsen แน่นอนคุณทำได้ ฉันจะไม่เปลี่ยนคำตอบมันเป็นปี 2015 และฉันรู้ว่าเวลาเปลี่ยนไป แต่ฉันจะเก็บมันไว้เพื่อลูกหลาน นอกจากนี้ฉันจะไม่เขียนแบบนี้อีกแล้ว :) แต่อย่าลังเลที่จะโพสต์ของคุณเป็นคำตอบของคุณเองฉันเดา?
บางอย่างที่นี่

1
ใช่ฉันเห็นด้วยคำตอบปัจจุบันใช้ได้ นั่นเป็นเหตุผลที่ฉันใส่ไว้ในความคิดเห็นเพียงเพื่อการอ้างอิงของผู้เยี่ยมชมใหม่
Patrick Michaelsen

1
ฉันใช้เกณฑ์มาตรฐานของฟังก์ชันนี้เทียบกับฟังก์ชันของคู่แข่ง 3 รายการและพบว่ามีประสิทธิภาพมากที่สุด - น้อยกว่า 1/3 ของเวลาดำเนินการของคู่แข่งที่แย่ที่สุด (Chrome 73) jsben.ch/AkHgP
Michael Thompson

92

คุณกำลังทำให้สิ่งที่ซับซ้อนเป็นเรื่องง่ายมาก คุณสามารถเพิ่มสิ่งนี้ใน CSS ของคุณ:

.capitalize {
    text-transform: capitalize;
}

ใน JavaScript คุณสามารถเพิ่มคลาสให้กับองค์ประกอบได้

 document.getElementById("element").className = "capitalize";

@epascarello ฉันไม่เข้าใจคุณคุณกำลังบอกอะไรฉัน?
Marcos Pérez Gude

คำถามคือ "ฟังก์ชั่นนี้มีอะไรผิดปกติ" ไม่เช่นนั้นจะซ้ำกับstackoverflow.com/questions/1026069/…หรือstackoverflow.com/questions/196972/…
Hacketo

2
ขอบคุณสำหรับการตอบกลับ แต่ฉันกำลังพยายามทำสิ่งนี้โดยใช้จาวาสคริปต์เพื่อฝึกฝน @ MarcosPérezGude
slurrr

1
ใช่มันอเนกประสงค์จริง
Marcos Pérez Gude

3
น่าเสียดายในบางกรณีหากค่าเป็น 20 มม. และคุณใช้ตัวพิมพ์ใหญ่จะเป็น 20 มม. จาวาสคริปต์บางกรณีอาจเป็นวิธีเดียว
Buts

79

ECMAScript 6เวอร์ชัน:

const toTitleCase = (phrase) => {
  return phrase
    .toLowerCase()
    .split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
};

let result = toTitleCase('maRy hAd a lIttLe LaMb');
console.log(result);


1
ฉันยังคิดว่าคุณหายไปtoLowerCase()ตั้งแต่แรกในกรณีที่ผู้ใช้หรือสตริงเป็นตัวพิมพ์เล็ก
ArchNoob

45

ฉันคิดว่าวิธีนี้น่าจะเร็วกว่า ทำให้ไม่แยกสตริงและเข้าร่วมอีกครั้ง เพียงแค่ใช้ regex

var str = text.replace(/(^\w{1})|(\s{1}\w{1})/g, match => match.toUpperCase());

คำอธิบาย :

  1. (^\w{1}): จับคู่อักขระแรกของสตริง
  2. |: หรือ
  3. (\s{1}\w{1}): จับคู่อักขระหนึ่งตัวที่มาหลังจากช่องว่างหนึ่งช่อง
  4. g: ตรงกับทั้งหมด
  5. match => match.toUpperCase (): แทนที่ด้วย can take function ดังนั้น; แทนที่การจับคู่ด้วยการจับคู่ตัวพิมพ์ใหญ่

1
สะอาดขึ้นมาก!
Cliff Hall

ทำไม\s{1}? ฉันจะบอกว่า\s+มันใช้งานได้แม้จะมีช่องว่างระหว่างคำหลายคำ
ก็ตาม

ในกรณีของฉัน; มันคือ 1 ช่องว่างและใช่ มันน่าทำงาน!
nimeresam

สตริงไม่เปลี่ยนรูป regex จะแยกและเข้าร่วมภายใต้ประทุน ไม่มีทางรอบมันจริง
bluegrounds

24

หากคุณสามารถใช้ไลบรารีของบุคคลที่สามLodashก็มีฟังก์ชันผู้ช่วยให้คุณ

https://lodash.com/docs/4.17.3#startCase

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'

_.startCase('fooBar');
// => 'Foo Bar'

_.startCase('__FOO_BAR__');
// => 'FOO BAR'
<script src="https://cdn.jsdelivr.net/lodash/4.17.3/lodash.min.js"></script>


19

ใน ECMAScript 6 คำตอบหนึ่งบรรทัดโดยใช้ฟังก์ชันลูกศร:

const captialize = words => words.split(' ').map( w =>  w.substring(0,1).toUpperCase()+ w.substring(1)).join(' ')

3
ดี! คุณสามารถใช้w[0]เพื่อให้ได้สั้น .. ซึ่งแตกต่างจาก regex มันสามารถขยายได้อย่างง่ายดายโดยสัญลักษณ์ใด ๆ spaceแต่ไม่เพียง แต่ ฉันหมายถึงอะไร( [ "เพราะตัวอักษรควรเป็นตัวพิมพ์ใหญ่หลังสัญลักษณ์เหล่านี้เช่นกัน ขอบคุณสำหรับการแก้ปัญหาของคุณ!
Systems Rebooter

17

One Liner ที่สั้นที่สุด (เร็วมากด้วย):

 text.replace(/(^\w|\s\w)/g, m => m.toUpperCase());

คำอธิบาย:

  • ^\w : อักขระตัวแรกของสตริง
  • | : หรือ
  • \s\w : อักขระตัวแรกหลังช่องว่าง
  • (^\w|\s\w) จับรูปแบบ
  • g ตั้งค่าสถานะ: จับคู่เหตุการณ์ทั้งหมด

หากคุณต้องการให้แน่ใจว่าส่วนที่เหลือเป็นตัวพิมพ์เล็ก:

text.replace(/(^\w|\s\w)(\S*)/g, (_,m1,m2) => m1.toUpperCase()+m2.toLowerCase())

นี่มันสุดยอดมาก! RegEx ดีที่สุด คุณสามารถอธิบายเพิ่มเติมว่าส่วนนี้ทำอะไรได้บ้าง? m => m.toUpperCase()
marcin2x4

1
@ marcin2x4 mตรงกับอักขระตัวแรกดังนั้นจึงทำให้อักขระตัวแรกเป็นตัวพิมพ์ใหญ่
ไก่

12

ECMAScript 6เวอร์ชัน:

title
    .split(/ /g).map(word =>
        `${word.substring(0,1).toUpperCase()}${word.substring(1)}`)
    .join(" ");

6
ตอนนี้ฉันเห็นแค่นี้และมันค่อนข้างเรียบร้อย แต่ฉันคิดว่าคุณต้องเข้าร่วมโดยใช้ a " "แทน""มิฉะนั้นคุณจะได้คำใหญ่คำเดียวไม่?
อะไรสักอย่าง

9

𝗙𝗮𝘀𝘁𝗲𝘀𝘁𝗦𝗼𝗹𝘂𝘁𝗶𝗼𝗻𝗙𝗼𝗿𝗟𝗮𝘁𝗶𝗻-𝗜𝗖𝗵𝗮𝗿𝗮𝗰𝘁𝗲𝗿𝘀

คุณสามารถใช้ฟังก์ชันนิพจน์ทั่วไปเพื่อเปลี่ยนการใช้อักษรตัวพิมพ์ใหญ่แต่ละตัวได้ ด้วยการเพิ่มประสิทธิภาพ V8 JIST สิ่งนี้ควรพิสูจน์ได้ว่าเร็วและมีประสิทธิภาพของหน่วยความจำ

// Only works on Latin-I strings
'tHe VeRy LOOong StRINg'.replace(/\b[a-z]|['_][a-z]|\B[A-Z]/g, function(x){return x[0]==="'"||x[0]==="_"?x:String.fromCharCode(x.charCodeAt(0)^32)})

หรือเป็นฟังก์ชัน:

// Only works for Latin-I strings
var fromCharCode = String.fromCharCode;
var firstLetterOfWordRegExp = /\b[a-z]|['_][a-z]|\B[A-Z]/g;
function toLatin1UpperCase(x){ // avoid frequent anonymous inline functions
    var charCode = x.charCodeAt(0);
    return charCode===39 ? x : fromCharCode(charCode^32);
}
function titleCase(string){
    return string.replace(firstLetterOfWordRegExp, toLatin1UpperCase);
}

ตามเกณฑ์มาตรฐานนี้โค้ดจะเร็วกว่าโซลูชันที่ดีที่สุดใน Chrome ถึง 33%


𝗗𝗲𝗺𝗼

<textarea id="input" type="text">I'm a little tea pot</textarea><br /><br />
<textarea id="output" type="text" readonly=""></textarea>
<script>
(function(){
    "use strict"
    var fromCode = String.fromCharCode;
    function upper(x){return x[0]==="'"?x:fromCode(x.charCodeAt(0) ^ 32)}
    (input.oninput = function(){
      output.value = input.value.replace(/\b[a-z]|['_][a-z]|\B[A-Z]/g, upper);
    })();
})();
</script>


คุณลืมเพิ่มผลตอบแทนให้กับฟังก์ชันของคุณใน: function autoCaps (string) {return string.replace (/ \ b [az] | \ B [AZ] / g, function (x) {return String.fromCharCode (x.charCodeAt (0) ^ 32);}); }
Archy

@Archy ขอบคุณสำหรับการแก้ไข ฉันได้ทำการเปลี่ยนแปลงที่คุณเสนอแล้ว
Jack Giffin



5

กิจวัตรนี้จะจัดการคำที่ยัติภังค์และคำที่มีเครื่องหมายอะพอสทรอฟี

function titleCase(txt) {
    var firstLtr = 0;
    for (var i = 0;i < text.length;i++) {
        if (i == 0 &&/[a-zA-Z]/.test(text.charAt(i)))
            firstLtr = 2;
        if (firstLtr == 0 &&/[a-zA-Z]/.test(text.charAt(i)))
            firstLtr = 2;
        if (firstLtr == 1 &&/[^a-zA-Z]/.test(text.charAt(i))){
            if (text.charAt(i) == "'") {
                if (i + 2 == text.length &&/[a-zA-Z]/.test(text.charAt(i + 1)))
                    firstLtr = 3;
                else if (i + 2 < text.length &&/[^a-zA-Z]/.test(text.charAt(i + 2)))
                    firstLtr = 3;
            }
        if (firstLtr == 3)
            firstLtr = 1;
        else
            firstLtr = 0;
        }
        if (firstLtr == 2) {
            firstLtr = 1;
            text = text.substr(0, i) + text.charAt(i).toUpperCase() + text.substr(i + 1);
        }
        else {
            text = text.substr(0, i) + text.charAt(i).toLowerCase() + text.substr(i + 1);
        }
    }
}

titleCase("pAt o'Neil's");
// returns "Pat O'Neil's";


4

let cap = (str) => {
  let arr = str.split(' ');
  arr.forEach(function(item, index) {
    arr[index] = item.replace(item[0], item[0].toUpperCase());
  });

  return arr.join(' ');
};

console.log(cap("I'm a little tea pot"));

เวอร์ชันที่อ่านได้อย่างรวดเร็วโปรดดูเกณฑ์มาตรฐานhttp://jsben.ch/k3JVz ใส่คำอธิบายภาพที่นี่


4

ไวยากรณ์ ES6

const captilizeAllWords = (sentence) => {
  if (typeof sentence !== "string") return sentence;
  return sentence.split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
}


captilizeAllWords('Something is going on here')

ไม่ควรแทนที่ word.slice (1) ด้วย word.slice (1) .toLowerCase () เพื่อให้แน่ใจว่าส่วนที่เหลือไม่ได้เป็นตัวพิมพ์ใหญ่ (ในกรณีที่อยู่ในประโยคเดิม)?
Anton Krug

4

คุณสามารถใช้ไวยากรณ์ JS ที่ทันสมัยซึ่งทำให้ชีวิตของคุณง่ายขึ้นมาก นี่คือข้อมูลโค้ดของฉันสำหรับปัญหาที่ระบุ:

const capitalizeString = string => string.split(' ').map(item => item.replace(item.charAt(0), item.charAt(0).toUpperCase())).join(' ');
capitalizeString('Hi! i am aditya shrivastwa')


3

ฉันมักจะไม่ใช้ regexp เนื่องจากความสามารถในการอ่านและฉันพยายามอยู่ห่างจากลูป ฉันคิดว่านี่เป็นประเภทที่อ่านได้

function capitalizeFirstLetter(string) {
    return string && string.charAt(0).toUpperCase() + string.substring(1);
};

3

ฟังก์ชันด้านล่างนี้ไม่ได้เปลี่ยนแปลงส่วนอื่น ๆ ของสตริงนอกจากการพยายามแปลงตัวอักษรตัวแรกของคำทั้งหมด (เช่นตามนิยาม regex \w+) เป็นตัวพิมพ์ใหญ่

นั่นหมายความว่าไม่จำเป็นต้องแปลงคำเป็น Titlecase แต่ทำตามที่ชื่อของคำถามระบุว่า: "Capitalize First Letter of Each Word In A String - JavaScript"

  • อย่าแยกสตริง
  • กำหนดแต่ละคำโดย regex \w+ที่เทียบเท่ากับ[A-Za-z0-9_]+
    • ใช้ฟังก์ชันString.prototype.toUpperCase()เฉพาะกับอักขระตัวแรกของแต่ละคำ
function first_char_to_uppercase(argument) {
  return argument.replace(/\w+/g, function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1);
  });
}

ตัวอย่าง:

first_char_to_uppercase("I'm a little tea pot");
// "I'M A Little Tea Pot"
// This may look wrong to you, but was the intended result for me
// You may wanna extend the regex to get the result you desire, e.g., /[\w']+/

first_char_to_uppercase("maRy hAd a lIttLe LaMb");
// "MaRy HAd A LIttLe LaMb"
// Again, it does not convert words to Titlecase

first_char_to_uppercase(
  "ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples"
);
// "ExampleX: CamelCase/UPPERCASE&Lowercase,ExampleY:N0=Apples"

first_char_to_uppercase("…n1=orangesFromSPAIN&&n2!='a sub-string inside'");
// "…N1=OrangesFromSPAIN&&N2!='A Sub-String Inside'"

first_char_to_uppercase("snake_case_example_.Train-case-example…");
// "Snake_case_example_.Train-Case-Example…"
// Note that underscore _ is part of the RegEx \w+

first_char_to_uppercase(
  "Capitalize First Letter of each word in a String - JavaScript"
);
// "Capitalize First Letter Of Each Word In A String - JavaScript"

แก้ไข 2019-02-07: หากคุณต้องการ Titlecase จริง (เช่นเฉพาะตัวอักษรตัวแรกตัวพิมพ์ใหญ่ตัวพิมพ์เล็กอื่น ๆ ทั้งหมด):

function titlecase_all_words(argument) {
  return argument.replace(/\w+/g, function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
  });
}

ตัวอย่างที่แสดงทั้งสอง:

test_phrases = [
  "I'm a little tea pot",
  "maRy hAd a lIttLe LaMb",
  "ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples",
  "…n1=orangesFromSPAIN&&n2!='a sub-string inside'",
  "snake_case_example_.Train-case-example…",
  "Capitalize First Letter of each word in a String - JavaScript"
];
for (el in test_phrases) {
  let phrase = test_phrases[el];
  console.log(
    phrase,
    "<- input phrase\n",
    first_char_to_uppercase(phrase),
    "<- first_char_to_uppercase\n",
    titlecase_all_words(phrase),
    "<- titlecase_all_words\n "
  );
}

// I'm a little tea pot <- input phrase
// I'M A Little Tea Pot <- first_char_to_uppercase
// I'M A Little Tea Pot <- titlecase_all_words

// maRy hAd a lIttLe LaMb <- input phrase
// MaRy HAd A LIttLe LaMb <- first_char_to_uppercase
// Mary Had A Little Lamb <- titlecase_all_words

// ExampleX: CamelCase/UPPERCASE&lowercase,exampleY:N0=apples <- input phrase
// ExampleX: CamelCase/UPPERCASE&Lowercase,ExampleY:N0=Apples <- first_char_to_uppercase
// Examplex: Camelcase/Uppercase&Lowercase,Exampley:N0=Apples <- titlecase_all_words

// …n1=orangesFromSPAIN&&n2!='a sub-string inside' <- input phrase
// …N1=OrangesFromSPAIN&&N2!='A Sub-String Inside' <- first_char_to_uppercase
// …N1=Orangesfromspain&&N2!='A Sub-String Inside' <- titlecase_all_words

// snake_case_example_.Train-case-example… <- input phrase
// Snake_case_example_.Train-Case-Example… <- first_char_to_uppercase
// Snake_case_example_.Train-Case-Example… <- titlecase_all_words

// Capitalize First Letter of each word in a String - JavaScript <- input phrase
// Capitalize First Letter Of Each Word In A String - JavaScript <- first_char_to_uppercase
// Capitalize First Letter Of Each Word In A String - Javascript <- titlecase_all_words

3
function titleCase(str) {

    var myString = str.toLowerCase().split(' ');
    for (var i = 0; i < myString.length; i++) {
        var subString = myString[i].split('');
        for (var j = 0; j < subString.length; j++) {
            subString[0] = subString[0].toUpperCase();
        }
        myString[i] = subString.join('');
    }

    return myString.join(' ');
}

1
เพิ่มความคิดเห็นในคำตอบของคุณ
HDJEMAI

3

หรือสามารถทำได้โดยใช้แทนที่ () และแทนที่อักษรตัวแรกของแต่ละคำด้วย "upperCase"

function titleCase(str) {
    return str.toLowerCase().split(' ').map(function(word) {
               return word.replace(word[0], word[0].toUpperCase());
           }).join(' ');
}

titleCase("I'm a little tea pot");

2

นี่คือวิธีที่คุณสามารถทำได้โดยใช้mapฟังก์ชันโดยพื้นฐานแล้วมันจะเหมือนกับคำตอบที่ยอมรับ แต่ไม่มีไฟล์for-loop. ดังนั้นช่วยให้คุณประหยัดรหัสไม่กี่บรรทัด

function titleCase(text) {
  if (!text) return text;
  if (typeof text !== 'string') throw "invalid argument";

  return text.toLowerCase().split(' ').map(value => {
    return value.charAt(0).toUpperCase() + value.substring(1);
  }).join(' ');
}

console.log(titleCase("I'm A little tea pot"));


2

ด้านล่างนี้เป็นอีกวิธีหนึ่งในการใช้อักษรตัวแรกของแต่ละคำในสตริง

สร้างเมธอดแบบกำหนดเองสำหรับอ็อบเจ็กต์ String โดยใช้prototype.

String.prototype.capitalize = function() {
    var c = '';
    var s = this.split(' ');
    for (var i = 0; i < s.length; i++) {
        c+= s[i].charAt(0).toUpperCase() + s[i].slice(1) + ' ';
    }
    return c;
}
var name = "john doe";
document.write(name.capitalize());

1

การเขียนใหม่ที่กะทัดรัด (และทันสมัย) มากขึ้นของ @ บางสิ่งมีโซลูชันที่เสนอ:

let titleCase = (str => str.toLowerCase().split(' ').map(
                c => c.charAt(0).toUpperCase() + c.substring(1)).join(' '));
    
document.write(titleCase("I'm an even smaller tea pot"));


1

รหัสดิบ:

function capi(str) {
    var s2 = str.trim().toLowerCase().split(' ');
    var s3 = [];
    s2.forEach(function(elem, i) {
        s3.push(elem.charAt(0).toUpperCase().concat(elem.substring(1)));
    });
    return s3.join(' ');
}
capi('JavaScript string exasd');

คุณควรให้รายละเอียดเพิ่มเติมอีกเล็กน้อย (มีอะไรผิดปกติ)
เลี้ยง

1

ฉันใช้replace()กับนิพจน์ทั่วไป:

function titleCase(str) {

  var newStr = str.toLowerCase().replace(/./, (x) => x.toUpperCase()).replace(/[^']\b\w/g, (y) => y.toUpperCase());

  console.log(newStr);
}

titleCase("I'm a little tea pot")

1

โซลูชันที่สมบูรณ์และเรียบง่ายอยู่ที่นี่:

String.prototype.replaceAt=function(index, replacement) {
        return this.substr(0, index) + replacement+ this.substr(index
  + replacement.length);
}
var str = 'k j g           u              i l  p';
function capitalizeAndRemoveMoreThanOneSpaceInAString() {
    for(let i  = 0; i < str.length-1; i++) {
        if(str[i] === ' ' && str[i+1] !== '')
            str = str.replaceAt(i+1, str[i+1].toUpperCase());
    }
    return str.replaceAt(0, str[0].toUpperCase()).replace(/\s+/g, ' ');
}
console.log(capitalizeAndRemoveMoreThanOneSpaceInAString(str));

ทำไมคุณถึงแก้ไข String.prototype ทุกครั้งที่เรียกเมธอดนี้? หากสิ่งใดที่คุณต้องทำเพียงครั้งเดียวและคุณไม่ควรสัมผัสต้นแบบของบิวท์อิน มันเป็นเรื่องเล็กน้อย ...
บางอย่างที่นี่

1
let str = "I'm a little tea pot";

str = str.toLowerCase();

และเพิ่มคุณสมบัติ css ให้text-transform: capitalize;กับองค์ประกอบที่เกี่ยวข้อง


0

โปรดตรวจสอบรหัสด้านล่าง

function titleCase(str) {
  var splitStr = str.toLowerCase().split(' ');
  var nstr = ""; 
  for (var i = 0; i < splitStr.length; i++) {
    nstr +=  (splitStr[i].charAt(0).toUpperCase()+ splitStr[i].slice(1) + " 
    ");
  }
  console.log(nstr);
}

var strng = "this is a new demo for checking the string";
titleCase(strng);

2
ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือเฉพาะบางอย่างได้ทันที คำอธิบายที่เหมาะสมมากจะเพิ่มมูลค่าในระยะยาวด้วยการแสดงเหตุผลนี้เป็นทางออกที่ดีในการแก้ไขปัญหาและจะทำให้มันมีประโยชน์มากขึ้นให้กับผู้อ่านในอนาคตกับอื่น ๆ คำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงสมมติฐานที่คุณตั้งขึ้น
iBug

0

ณ ECMA2017 หรือ ES8

const titleCase = (string) => {
  return string
    .split(' ')
    .map(word => word.substr(0,1).toUpperCase() + word.substr(1,word.length))
    .join(' ');
};

let result = titleCase('test test test');
console.log(result);

คำอธิบาย:
1. ขั้นแรกเราส่งสตริง "test test test" ไปยังฟังก์ชัน "titleCase" ของเรา
2. เราแยกสตริงบนพื้นฐานช่องว่างดังนั้นผลลัพธ์ของฟังก์ชันแรก "แยก" จะเป็น ["test", "test", "test"]
3. เมื่อเราได้อาร์เรย์เราจึงใช้ฟังก์ชันแผนที่เพื่อจัดการกับแต่ละคำ ในอาร์เรย์ เราใช้ตัวพิมพ์ใหญ่เป็นตัวพิมพ์ใหญ่และเพิ่มอักขระที่เหลือเข้าไป
4. สุดท้ายเราเข้าร่วมอาร์เรย์โดยใช้ช่องว่างในขณะที่เราแบ่งสตริงด้วย sapce


toLowerCase()ผมคิดว่าคุณจะหายไปบางสิ่งบางอย่างในจุดเริ่มต้นมากก่อนที่จะแยกและนั่นคือ
ArchNoob

@ArchNoob ใช่เราสามารถเพิ่ม toLowerCase () ก่อนแยก แต่ทั้งหมดขึ้นอยู่กับกรณีการใช้งานเช่นหากเราต้องการเอาต์พุต "TeSt Test" สำหรับอินพุต "teSt test" ในกรณีนี้เราไม่สามารถเพิ่ม toLowerCase () ได้
Pulkit Aggarwal

0

function titleCase(str) {
  //First of all, lets make all the characters lower case
  let lowerCaseString = "";
  for (let i = 0; i < str.length; i++) {
    lowerCaseString = lowerCaseString + str[i].toLowerCase();
  }
  //Now lets make the first character in the string and the character after the empty character upper case and leave therest as it is
  let i = 0;
  let upperCaseString = "";
  while (i < lowerCaseString.length) {
    if (i == 0) {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else if (lowerCaseString[i - 1] == " ") {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else {
      upperCaseString = upperCaseString + lowerCaseString[i];
    }
    i = i + 1;
  }
  console.log(upperCaseString);

  return upperCaseString;
}

titleCase("hello woRLD");

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.