В настоящее время я работаю над исправлением, в котором существует функция, которая использует заглавные буквы для каждого слова данной строки. Каждое значение, полученное из этой функции, позже используется для проверки другой логики.
Итак, прямо сейчас эта функция неправильно использует заглавные буквы. Например, internet of things выходит как Internet Of Things, а мне нужно как Internet of Things
Это функция с настройкой, которую я сделал, в основном, если строка содержит «из», игнорируйте ее:
const cleanValue = value
.replace(/-/g, ' ')
.split(' ')
.map((word, i) => {
return word === 'of' && i != 0 ? word : word[0].toUpperCase() + word.substring(1);
})
.join(' ');
Но мой босс думает, что это какое-то хакерское решение, и просит меня найти лучшее решение, честно говоря, мне трудно попытаться исправить это лучше.
Любые советы/идеи, которые кто-нибудь может дать мне о том, как улучшить это?
Спасибо!
проблема в том, что вам нужно определить, какие слова должны быть исключениями. Например, мы знаем, что один из них, но как насчет (как во «Властелине колец»)? или и (как в Mac и Cheese) - надеюсь, вы можете сказать, как, чем больше исключений вы определяете, тем менее практичным кажется ваше решение.
Идеи: stackoverflow.com/a/6475125/271415
Невозможно всегда быть правильным, когда ввод был преобразован в формат, который теряет данные. Ваше решение кажется хорошим в качестве быстрого решения — оно расширяется до массива слов, которые не должны писаться с заглавной буквы, как видно из ответа includes — и если вам нужно что-то действительно надежное, тогда потребуется больше контекста (например, вы хотите дойти до того, чтобы попытаться понять язык?).
Что ж, вариант использования, лежащий в основе логики этой функциональности, заключается в том, что будет использоваться определенная группа фраз, которые, насколько я знаю, не содержат никаких других слов-исключений, отличных от: «из и,» для проверки других вещей. Итак, я думаю, что с предложенными ответами я получил то, что мне нужно, спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, вот решение javascript.
Предположим, вы получили строку с данными имени
const ignoreWords = ["of", "the", "and"]; //used as references other codes from this post
function stringUpperCase(Data){
let ArrayOfStrings = Data.split(" ");
let ArrayUpperCased = [];
ArrayOfStrings.map((word) =>{
if (!ignoreWords.includes(word.toLowerCase())){
ArrayUpperCased.push(word.charAt(0).toUpperCase() + word.slice(1)); //captalize the word
return;
}
ArrayUpperCased.push(word.toLowerCase());
return ;
})
return ArrayUpperCased.join(" ");
}
stringUpperCase("Test Of Text")
// return 'Test of Text'
Таким образом, вы можете настроить слова, которые вы хотите игнорировать, и те, которые вы хотите использовать в верхнем регистре;
Соответствующая часть этого кода такая же, как исходный код, а остальная часть хуже.
поэтому я не понимаю, чего он хочет, я подумал, что ему просто нужен рефакторинговый способ сделать это.
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Если вы хотите игнорировать некоторые слова, вы можете изменить свою функцию следующим образом.
const ignoreWords = ["of", "the", "and"];
const cleanValue = value
.replace(/-/g, ' ')
.split(' ')
.map((word) => {
return ignoreWords.includes(word.toLowerCase()) ? word : word[0].toUpperCase() + word.substring(1);
})
.join(' ');
Не уверен, что мне нравится эта идея — и она не очень эффективна — но она достаточно гибкая, чтобы приспособить кучу произвольных правил.
Вы можете объявить набор преобразователей, каждый из которых имеет 1) предикатную функцию, которая определяет, обрабатывает ли он конкретный случай, и 2) функцию для выполнения преобразования.
Последний трансформатор в наборе используется по умолчанию. Его предикат всегда возвращает true, и он использует заглавные буквы.
Разделите строку на слова и для каждого слова найдите преобразователь, который будет его обрабатывать.
const lowerMiddleWords = ['a', 'at', 'of', 'and', 'the', 'for', 'with'];
const capitalize = (word) => word[0].toUpperCase() + word.substring(1);
const transformers = [
{
predicate: (word, index) => index && lowerMiddleWords.includes(word),
transform: (word) => word,
},
{
predicate: (word, index, phrase) => phrase.includes('hackers'),
transform: (word) => capitalize(word.replaceAll('e', '3')),
},
{
predicate: () => true,
transform: capitalize,
}
]
function transform(string) {
return string.split(' ').map((word, index) => {
const transformer = transformers.find((t) => t?.predicate(word, index, string));
return transformer.transform(word);
}).join(' ');
}
[
"internet of things",
"for the birds",
"at peace with the world",
"the good, the bad, and the ugly",
"capitalize all of the things",
"leet hackers like threes",
].forEach(str => console.info(transform(str)));
Это больше вопрос IR (Information Retrieval). Например, «учить» компьютер знать, когда что-то писать с большой буквы.