Dấu gạch đầu dòng tiêu đề (viết hoa chữ cái đầu tiên của mỗi từ)


108

Tôi đang xem qua tài liệu lodash và các câu hỏi Stack Overflow khác - trong khi có một số cách JavaScript nguyên bản để hoàn thành nhiệm vụ này , có cách nào tôi có thể chuyển đổi một chuỗi thành tiêu đề bằng cách sử dụng các hàm lodash hoàn toàn (hoặc ít nhất là các hàm nguyên mẫu hiện có) để tôi không phải sử dụng biểu thức chính quy hoặc xác định một hàm mới?

ví dụ

This string ShouLD be ALL in title CASe

nên trở thành

This String Should Be All In Title Case


3
bạn có thể làm điều tương tự từ HTML cũng có, style = "text-transform: viết hoa"
Chaudhary

Câu trả lời:


213

Điều này có thể được thực hiện với một sửa đổi nhỏ startCase:

_.startCase(_.toLower(str));


3
_.startCase("aaa BBB ccc") === "Aaa BBB Ccc"
Brandon

2
Tôi thích nó. Tôi không biết về startCase.
Brandon

1
.startCase ( "camelString") === "Camel String" nhưng _.startCase ( .toLower ( "camelString")) === "Camelstring" có vẻ như lodash cần có một phương pháp titleCase
aristidesfl

4
Tôi thích điều này, tuy nhiên, nó loại bỏ các ký tự như :, đó là một vấn đề.
JabberwockyDecompiler

1
Nó không hoạt động đối với những tên đầu tiên có dấu (tiếng Tây Ban Nha "Martínez Cortés Peña" trở thành "Martinez Cortes Pena") hoặc có dấu gạch ngang (tiếng Pháp "Jean-Louis" trở thành "Jean Louis"). Tương tự với bất kỳ chức năng "* Case" nào của lodash
Flo

42
_.startCase(_.camelCase(str))

Đối với văn bản không phải do người dùng tạo, điều này xử lý nhiều trường hợp hơn câu trả lời được chấp nhận

> startCase(camelCase('myString'))
'My String'
> startCase(camelCase('my_string'))
'My String'
> startCase(camelCase('MY_STRING'))
'My String'
> startCase(camelCase('my string'))
'My String'
> startCase(camelCase('My string'))
'My String'

27

với phiên bản lodash 4.

_.upperFirst(_.toLower(str))


3
Cái này tốt hơn startCasevì nó có thể xử lý nhiều chữ cái hơn az, ví dụ å, ä và ö.
Lars Nyström

3
upperFirst sẽ chỉ thay đổi ký tự đầu tiên của từ đầu tiên, không thay đổi cho các từ tiếp theo. Tôi không tin rằng điều này tốt hơn startCase vì lý do cụ thể này.
Raghavan

15
'This string ShouLD be ALL in title CASe'
  .split(' ')
  .map(_.capitalize)
  .join(' ');

1
Chắc chắn là ngắn gọn nhất, thích nó. Rõ ràng là vẫn yêu cầu tách thành một mảng, nhưng đó vẫn là giải pháp ngắn nhất và ngọt ngào nhất từ ​​những gì tôi có thể nói. Ngoài ra, theo vấn đề 1528 mà @AlexandreThebaldi đã chỉ ra, có lẽ nên sử dụng upperFirstthay vì capitalize.
brandonscript

... nhưng _.startCase chắc chắn thắng :)
brandonscript

5
_.startCaseloại bỏ dấu chấm câu. Ví dụ _.startCase('first second etc...trả về chuỗiFirst Second Etc
LuckyStarr

Đây là tốt hơn đối với trường hợp sử dụng của tôi là startCasecải đạo tất cả mọi thứ vào một trống ví dụ user_namesẽ được User Name, và tôi chỉ muốn User_namenhư text-transform: capitalizetài sản của CSS
gonzarodriguezt

7

Có nhiều câu trả lời khác nhau cho câu hỏi này. Một số đề xuất sử dụng _.upperFirsttrong khi một số đề xuất _.startCase.

Biết sự khác biệt giữa chúng.

i) _.upperFirstsẽ biến đổi chữ cái đầu tiên trong chuỗi của bạn, sau đó chuỗi có thể gồm một từ hoặc nhiều từ nhưng chữ cái đầu tiên duy nhất của chuỗi của bạn được chuyển thành chữ hoa.

_.upperFirst('jon doe')

đầu ra:

Jon doe

kiểm tra tài liệu https://lodash.com/docs/4.17.10#upperFirst

ii) _.startCasesẽ biến đổi chữ cái đầu tiên của mỗi từ bên trong chuỗi của bạn.

_.startCase('jon doe')

đầu ra:

Jon Doe

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


Đúng, nhưng những gì về chuỗi trường hợp hỗn hợp? Cả hai thứ này sẽ không biến 'jOn DoE' thành 'Jon Doe' nếu không có _.lower().
brandonscript

3

Đây là một cách CHỈ sử dụng phương thức lodash và không sử dụng phương pháp nội trang:

_.reduce(_.map(_.split("Hello everyOne IN the WOrld", " "), _.capitalize), (a, b) => a + " " + b)

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

Bạn cũng có thể tách chức năng bản đồ để làm các từ riêng biệt


0
 var s = 'This string ShouLD be ALL in title CASe';
 _.map(s.split(' '), (w) => _.capitalize(w.toLowerCase())).join(' ')

Trừ khi tôi bỏ lỡ, lodash không có các phương thức viết thường / viết hoa riêng.


@vbotio vẻ thích _.upperFirstchỉ áp dụng cho các ký tự đầu tiên (một từ đồng nghĩa với _.capitalize()?)
brandonscript

1
capitalizeupperFirstlàm những điều khác nhau.
Brandon

_.capitalize áp dụng cho toàn bộ chuỗi
vbotio

0

Không ngắn gọn như câu trả lời của @ 4castle, nhưng mang tính mô tả và đầy đủ, tuy nhiên ...

var basicTitleCase = _
    .chain('This string ShouLD be ALL in title CASe')
    .toLower()
    .words()
    .map(_.capitalize)
    .join(' ')
    .value()

console.log('Result:', basicTitleCase)
console.log('Exact Match:' , basicTitleCase === 'This String Should Be All In Title Case')
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>


Tôi đoán rằng độ dài và độ dài của câu trả lời khiến nó gần như không mong muốn. Tôi không phản đối, nhưng đó không phải là lựa chọn đầu tiên của tôi.
brandonscript

0

Đây là một giải pháp khác cho trường hợp sử dụng của tôi: "xương sống của quỷ"

Đơn giản:

function titleCase (str) {
  return _.map(str.split(' '), _.upperFirst).join(' ');
}

Sử dụng startCase sẽ loại bỏ dấu nháy đơn, vì vậy tôi phải khắc phục hạn chế đó. Các giải pháp khác có vẻ khá phức tạp. Tôi thích điều này vì nó sạch sẽ, dễ hiểu.


0

Điều này có thể được thực hiện chỉ với lodash

properCase = string =>
        words(string)
            .map(capitalize)
            .join(' ');

const proper = properCase('make this sentence propercase');

console.log(proper);
//would return 'Make This Sentence Propercase'

Bạn cần phải viết hoa và các từ của lodash.
Justin Brown


Có, nhưng bạn không gọi các hàm từ lodash; trừ khi bạn đã aliased họ bằng cách nào đóvar words = ._words
brandonscript

0

Đoạn mã dưới đây sẽ hoạt động hoàn hảo:

var str = "TITLECASE";
_.startCase(str.toLowerCase());

-3

với lodash 4, bạn có thể sử dụng _.capitalize ()

_.capitalize('JOHN') Nó trả về 'John'

Xem https://lodash.com/docs/4.17.5#capitalize để biết thêm chi tiết


Sẽ rất tốt nếu bạn kiểm tra trường hợp sử dụng cho một câu từ. Hãy nghi ngờ điều này không viết hoa tất cả các chữ cái đầu tiên của mỗi từ.
brandonscript

Thật vậy, 'câu' đầu ra 'Câu'
Andres Zapata
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.