#javascript #string
#javascript #строка
Вопрос:
Я пытаюсь написать функцию, которая возвращает только первые восемь слов предложения. Однако, если первое предложение короче восьми слов, я хочу вернуть только первое предложение, а не первые восемь слов.
Например, если тестируемое предложение было «Это предложение, которое намного длиннее восьми слов, но будут выведены только первые восемь слов».
Результатом будет: «Это предложение, которое намного длиннее»
Если бы я добавил знаки препинания (которые ищет функция), чтобы изменить входные данные на «Это предложение. это намного длиннее восьми слов, но будут выведены только первые восемь слов.»
Результатом будет: «Это предложение».
Вот код:
function checkString(string) {
var splitSentence = string.split(" ");
var firstEightWords = splitSentence.slice(0, 8);
var joinedString = firstEightWords.join(" ")
var chars = joinedString.split("")
for (var x = 0; x < chars.length; x ) {
if ((chars[x] === ".") || (chars[x] === "?") || (chars[x] === "!")) {
var finalProduct = chars.slice(0, x 1).join("");
return finalProduct;
} else {
return firstEightWords
}
}
};
var str = checkString("This is a sentence that is much longer than eight words, but only the first eight words will be outputted.");
console.log(str);
Комментарии:
1. Какое первое предложение меньше восьми слов?
2. @jro, да, в моем операторе if функция ищет либо .! или?
3. Вы можете использовать string.split(«.») для разделения на предложения, разделенные символом d.. Вы могли бы использовать какое-нибудь регулярное выражение для этого
4. @JackCollins Разделите строку с помощью знаков препинания, затем проверьте, превышает ли ее длина 8 символов, если да, то возьмите из нее подстроку и верните, в противном случае верните как есть..
Ответ №1:
Похоже, что вас может смутить разделение вашей строки на массив слов, прежде чем вы разберетесь с разделителями предложений. Сначала просто разберитесь с разделителями предложений, а затем вы можете просто использовать slice, чтобы ограничить количество слов максимум 8.
Немного более компактная версия, использующая только split
, slice
и join
:
const longer = 'This is a sentence that is much longer than eight words, but only the first eight words will be outputted.';
const shorter = 'This is a sentence. that is much longer than eight words, but only the first eight words will be outputted.';
const trunc = (s) => s.split(/[.?!]/)[0].split(' ').slice(0, 8).join(' ');
console.log(trunc(longer));
// This is a sentence that is much longer
console.log(trunc(shorter));
// This is a sentence
Если вам нужно сохранить знаки препинания в конце для предложений, содержащих 8 слов или меньше, то вы можете добавить search
в микс:
const longer = 'This is a sentence that is much longer than eight words, but only the first eight words will be outputted.';
const shorter = 'This is a sentence. that is much longer than eight words, but only the first eight words will be outputted.';
const trunc = (s) => {
const i = s.search(/[.?!]/) 1;
return s.slice(0, i ? i : s.length).split(' ').slice(0, 8).join(' ');
};
console.log(trunc(longer));
// This is a sentence that is much longer
console.log(trunc(shorter));
// This is a sentence.
Комментарии:
1. substr намного эффективнее, чем split, плюс вы теряете знак препинания, который OP просил включить.
2. @AdrianBrand — хорошая точка в конце пунктуации в ожидаемом выводе (ответ отредактирован соответствующим образом). Что касается производительности, обобщения полезны лишь изредка — лучше всего протестировать конкретные подходы с конкретными наборами данных и средами, если у вас есть ситуация, требующая такого уровня оптимизации.
3. Что вы подразумеваете под «обобщения полезны лишь изредка». substr будет принимать символы только до первого знака препинания, split создаст массив со всей строкой, и производительность значительно улучшится, чем длиннее строка и чем больше знаков препинания. Не существует набора данных, в котором использование разделения на знаки препинания давало бы лучшую производительность.
Ответ №2:
const checkString = str => str.substr(0, /[.?!]/.exec(str).index 1).split(' ').filter((_, idx) => idx < 8).join(' ');
console.log(checkString("This is a sentence that is much longer than eight words, but only the first eight words will be outputted."));
console.log(checkString("This is a sentence. This is another sentence."));
console.log(checkString("This is a sentence? This is another sentence."));
console.log(checkString("This is a sentence! This is another sentence."));