Прописать каждое первое слово, кроме некоторых - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь использовать первый символ всех слов в строке.

Условие 1. есть некоторые исключенные слова, такие как: 'of', 'the', которые не должны
Условие 2. Исключенный мир не должен быть первым в строке.

Вот мой код:

const movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let exludeWords = ['of', 'the']
  arr = title.split(' ');
  return arr.map(word =>
  {
     return exludeWords.includes(word) ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('psycho')); //'Psycho';
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter()); //'';

Я сделал выше одного, но не мог найти пути, кроме первого слова. Или любой другой лучший способ получить результат?

Ответы [ 6 ]

2 голосов
/ 25 февраля 2020

Вот альтернативный подход, использующий метод .replace() с функцией замены в качестве второго аргумента. Регулярное выражение сопоставляет все строки символов слова, разделенных границами слова, и использует их заглавные буквы в зависимости от того, находится ли он в массиве exludeWords:

const cap = str => str.charAt(0).toUpperCase() + str.slice(1);
const movieTitleFormatter = (title = '') => {
  const exludeWords = ['of', 'the']
  return cap(
    title.replace(/\b\w+\b/g, m => exludeWords.includes(m) ? m : cap(m))
  );
}

console.log(movieTitleFormatter('psycho')); //'Psycho';
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter()); //'';
2 голосов
/ 25 февраля 2020

Просто добавьте еще одно условие, чтобы проверить индекс слова:

const movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let exludeWords = ['of', 'the']
  arr = title.split(' ');
  return arr.map((word, i) =>
  {
     return exludeWords.includes(word) && i!=0 ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('psycho')); //'Psycho';
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter()); //'';
0 голосов
/ 25 февраля 2020

Просто для ясности вы хотите, чтобы он повернул 'the last emperor' на 'The Last Emperor', а не на 'the Last Emperor', верно?

Если это так, я бы предложил вам добавить второй параметр карты , который является индексом (для получения дополнительной информации см. документ MDNs об Array.map () ), потому что тогда вы можете просто добавить проверку, является ли это первой позицией или нет.

Ваш фрагмент будет выглядеть так:

const movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let excludeWords = ['of', 'the']
  arr = title.split(' ');
  return arr.map((word, i) =>
  {
     return excludeWords.includes(word) && i > 0 ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('psycho'));
console.log(movieTitleFormatter('silence of the lambs'));
console.log(movieTitleFormatter('the last emperor'));
console.log(movieTitleFormatter());

Это должно делать то, что вы хотите, но я бы рекомендовал использовать RegEx для чего-то подобного.

0 голосов
/ 25 февраля 2020

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Syntax

const movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let exludeWords = ['of', 'the']
  arr = title.split(' ');
  return arr.map((word,idx) =>
  {
     return (exludeWords.includes(word) && idx !==0) ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('psycho')); //'Psycho';
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter()); //'';
0 голосов
/ 25 февраля 2020

У метода map есть второй параметр, который содержит индекс элемента в массиве. Зная это, вы можете использовать следующее

let  movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let exludeWords = ['of', 'the']
  arr = title.split(' ');
  return arr.map((word, index) =>
  {
     return exludeWords.includes(word) && index !=0 ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
0 голосов
/ 25 февраля 2020

Используйте заглавные буквы первого слова перед forEach()

const movieTitleFormatter = title => {
  if(!title) {
    return '';
  }
  let arr = [];
  let exludeWords = ['of', 'the']
  arr = title.split(' ');
  arr[0] = arr[0].charAt(0).toUpperCase() + arr[0].slice(1);
  return arr.map(word =>
  {
     return exludeWords.includes(word) ? [word] : word.charAt(0).toUpperCase() + word.slice(1);

  }).join(' ');
}

console.log(movieTitleFormatter('psycho')); //'Psycho';
console.log(movieTitleFormatter('silence of the lambs')); //'Silence of the Lambs';
console.log(movieTitleFormatter('the last emperor')); //'The Last Emperor'; //Here is shows wrong.
console.log(movieTitleFormatter());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...