Рубрики
Без рубрики

Расширение прототипа строки JavaScript

JavaScript потрясающий и так и встроен в методах. Но как бы мы расширили свои построенные прототипы? Читай дальше что бы узнать.

Автор оригинала: Dhruv Kumar Jha.

В то время как JavaScript строка Обеспечивает много способов манипулировать строками с, что мы можем сделать, если мы хотим, чтобы некоторые функциональные возможности не присутствуют в строковом прототипе?

Давайте рассмотрим этот пример:

У вас есть строка, содержащие предложения, и вам нужно извлечь выгоду из запуска каждого предложения. Первая буква предложения может быть/может не быть заглажена, мы не знаем количество предложений в строке, и мы должны использовать каждое предложение в строке.

У нас есть наши предложения, такие как:

let sentenceOne = "these violent delights have violent ends And in their triumph die, like fire and powder Which, as they kiss, consume. my bounty is as boundless as the sea, My love as deep; the more I give to thee, The more I have, for both are infinite. thus with a kiss I die. Don't waste your love on somebody, who doesn't value it. Good night, good night! parting is such sweet sorrow, That I shall say good night till it be morrow.for never was a story of more woe than this of Juliet and her Romeo.";
let sentenceTwo = "These are. words pretending to. be a sentence.";

Самое простое решение было бы написать функцию, которая проходит через строку, находит все предложения, а затем заглавят первую букву предложения.

Вот как мы можем сделать это:

function capitalizeSentence ( str ) {
  // let's split the string after every '.', Since every sentence ends with a dot.
  let sentences = str.split('.');

  // let's map over our sentences array 
  sentences.map( function (sentence) {
    console.log(sentence);
  });
}

capitalizeSentence( sentenceOne );

В консоли мы можем видеть:

"these violent delights have violent ends And in their triump die, like fire and powder Which, as they kiss, consume"
" my bounty is as boundless as the sea, My love as deep; the more I give to thee, The more I have, for both are infinite"
" thus with a kiss I die"
" Don't waste your love on somebody, who doesn't value it"
" Good night, good night! parting is such sweet sorrow, That I shall say good night till it be morrow"
"for never was a story of more woe than this of Juliet and her Romeo"
""

Не то, что я ожидал. В конце Предложения множество. Большая часть строки начинается с пространства.

Как мы это исправить? Должны ли мы исправить это?

Чтобы избавиться от пустой строки, мы можем сначала проверить, есть ли предложение Не пусто а затем продолжить дальше. Затем мы можем проверить, находится ли первый символ строки или нет, а затем выполнить нашу логику.

Код для этого будет выглядеть так:

function capitalizeSentence ( str ) {
  // let's split the string after every '.', Since every sentence ends with a dot.
  let sentences = str.split('.');
  let updated = [];

  // let's map over our sentences array 
  sentences.map( function (sentence) {
    if ( sentence ) {
      // if the first character is not spaced
      if ( sentence[0] !== ' ' ) {
        let output = sentence.charAt(0).toUpperCase() + sentence.slice(1);
        updated.push( output );
      }
      // if the first character is spaced
      else {
        let output = sentence.charAt(1).toUpperCase() + sentence.slice(2);
        updated.push( ' ' + output );
      }
    }
  });

  // let's join our array with ., the same character we split it with.
  let final = updated.join('.');

  // if the sentence ends with ., let's add it to our final output as well.
  if ( str.endsWith('.') ) {
    final += '.';
  }

  return final;
}

Конечно, это не самый лучший код и не удастся, если предложение содержит несколько пробелов после. (Период) Но я уверен, что вы можете справиться с этим.

Сейчас это работает. Мы можем проверить это, позвонив нашу функцию:

console.log( sentenceOne );
console.log( capitalizeSentence( sentenceOne ) );

И в Консоль мы можем видеть:

"these violent delights have violent ends And in their triump die, like fire and powder Which, as they kiss, consume. my bounty is as boundless as the sea, My love as deep; the more I give to thee, The more I have, for both are infinite. thus with a kiss I die. Don't waste your love on somebody, who doesn't value it. Good night, good night! parting is such sweet sorrow, That I shall say good night till it be morrow.for never was a story of more woe than this of Juliet and her Romeo."
"These violent delights have violent ends And in their triump die, like fire and powder Which, as they kiss, consume. My bounty is as boundless as the sea, My love as deep; the more I give to thee, The more I have, for both are infinite. Thus with a kiss I die. Don't waste your love on somebody, who doesn't value it. Good night, good night! parting is such sweet sorrow, That I shall say good night till it be morrow.For never was a story of more woe than this of Juliet and her Romeo."

Но не было бы лучше, если мы сможем напрямую позвонить по методу на нашей строке, как:

"Sentence one. sentence two and. sentence three.fourth sentence is best.".capitalize();

Ну, мы можем.

Мы можем сделать это, продлевая String.Prototype Отказ Мы просто должны внести незначительные изменения в нашем методе, а также добавить новую линейку кода.

function capitalizeSentence ( str ) {

  // if the string is not provided, and if it's called directly on the string, we can access the text via 'this'
  if ( ! str ) { str = this; }

  // let's split the string after every '.', Since every sentence ends with a dot.
  let sentences = str.split('.');
  let updated = [];

  // let's map over our sentences array 
  sentences.map( function (sentence) {
    if ( sentence ) {
      // if the first character is not space
      if ( sentence[0] !== ' ' ) {
        let output = sentence.charAt(0).toUpperCase() + sentence.slice(1);
        updated.push( output );
      }
      // if the first character is space
      else {
        let output = sentence.charAt(1).toUpperCase() + sentence.slice(2);
        updated.push( ' ' + output );
      }
    }
  });

  // let's join our array with ., same character we split it with.
  let final = updated.join('.');

  // if the sentence ends with ., let's add it to our final output as well.
  if ( str.endsWith('.') ) {
    final += '.';
  }

  return final;
}


// let's add our method on String prototype.
String.prototype.capitalize = capitalizeSentence;

Теперь мы можем напрямую назвать этот метод на нашей строке.

console.log( "Sentence one. sentence two and. sentence three.fourth sentence is best.".capitalize() );

// output
"Sentence one. Sentence two and. Sentence three.Fourth sentence is best."

И это работает как ожидалось.

Надеюсь, что это учебное пособие было интересно и полезно.