Сократите строку, не обрезая слова в JavaScript - PullRequest
78 голосов
/ 28 марта 2011

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

Скажем, у меня была следующая строка:

text = "this is a long string I cant display"

Я хочу сократить его до 10 символов, но если оно не заканчивается пробелом, допиши слово. Я не хочу, чтобы строковая переменная выглядела так:

"это длинная строка, которую я не могу найти"

Я хочу, чтобы оно заканчивало слово, пока не будет пробел.

Ответы [ 20 ]

1 голос
/ 08 декабря 2017

Я опоздал на вечеринку, но вот небольшое и простое решение, которое я нашел, чтобы вернуть количество слов.

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

function truncateWords(sentence, amount, tail) {
  const words = sentence.split(' ');

  if (amount >= words.length) {
    return sentence;
  }

  const truncated = words.slice(0, amount);
  return `${truncated.join(' ')}${tail}`;
}

const sentence = 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.';

console.log(truncateWords(sentence, 10, '...'));

Смотрите рабочий пример здесь: https://jsfiddle.net/bx7rojgL/

1 голос
/ 22 декабря 2013

Это исключает последнее слово вместо того, чтобы включать его.

function smartTrim(str, length, delim, appendix) {
    if (str.length <= length) return str;

    var trimmedStr = str.substr(0, length+delim.length);

    var lastDelimIndex = trimmedStr.lastIndexOf(delim);
    if (lastDelimIndex >= 0) trimmedStr = trimmedStr.substr(0, lastDelimIndex);

    if (trimmedStr) trimmedStr += appendix;
    return trimmedStr;
}

Использование:

smartTrim(yourString, 11, ' ', ' ...')
"The quick ..."
0 голосов
/ 26 мая 2019

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

function solution(message, k) {
    if(!message){
        return ""; //when message is empty
    }
    const messageWords = message.split(" ");
    let result = messageWords[0];
    if(result.length>k){
        return ""; //when length of first word itself is greater that k
    }
    for(let i = 1; i<messageWords.length; i++){
        let next = result + " " + messageWords[i];

        if(next.length<=k){
            result = next;
        }else{
            break;
        }
    }
    return result;
}

console.log(solution("this is a long string i cant display", 10));
0 голосов
/ 08 января 2019

Я опоздал на это, но я думаю, что эта функция делает именно то, что запрашивает OP.Вы можете легко изменить значения SENTENCE и LIMIT для разных результатов.

function breakSentence(word, limit) {
  const queue = word.split(' ');
  const list = [];

  while (queue.length) {
    const word = queue.shift();

    if (word.length >= limit) {
      list.push(word)
    }
    else {
      let words = word;

      while (true) {
        if (!queue.length ||
            words.length > limit ||
            words.length + queue[0].length + 1 > limit) {
          break;
        }

        words += ' ' + queue.shift();
      }

      list.push(words);
    }
  }

  return list;
}

const SENTENCE = 'the quick brown fox jumped over the lazy dog';
const LIMIT = 11;

// get result
const words = breakSentence(SENTENCE, LIMIT);

// transform the string so the result is easier to understand
const wordsWithLengths = words.map((item) => {
  return `[${item}] has a length of - ${item.length}`;
});

console.log(wordsWithLengths);

Выходные данные этого фрагмента, где LIMIT равен 11:

[ '[the quick] has a length of - 9',
  '[brown fox] has a length of - 9',
  '[jumped over] has a length of - 11',
  '[the lazy] has a length of - 8',
  '[dog] has a length of - 3' ]
0 голосов
/ 20 сентября 2018

Не нашли удовлетворительное решение, за которое проголосовали. Поэтому я написал что-то общее и работает как с первой, так и с последней частью вашего текста (что-то вроде substr, но для слов). Также вы можете установить, хотите ли вы, чтобы пробелы не учитывались при подсчете символов.

    function chopTxtMinMax(txt, firstChar, lastChar=0){
        var wordsArr = txt.split(" ");
        var newWordsArr = [];

        var totalIteratedChars = 0;
        var inclSpacesCount = true;

        for(var wordIndx in wordsArr){
            totalIteratedChars += wordsArr[wordIndx].length + (inclSpacesCount ? 1 : 0);
            if(totalIteratedChars >= firstChar && (totalIteratedChars <= lastChar || lastChar==0)){
                newWordsArr.push(wordsArr[wordIndx]);
            }
        }

        txt = newWordsArr.join(" ");
        return txt;
    }
0 голосов
/ 21 декабря 2016

Для чего стоит я написал это, чтобы обрезать до границы слова, не оставляя пунктуации или пробела в конце строки:

function truncateStringToWord(str, length, addEllipsis)
{
    if(str.length <= length)
    {
        // provided string already short enough
        return(str);
    }

    // cut string down but keep 1 extra character so we can check if a non-word character exists beyond the boundary
    str = str.substr(0, length+1);

    // cut any non-whitespace characters off the end of the string
    if (/[^\s]+$/.test(str))
    {
        str = str.replace(/[^\s]+$/, "");
    }

    // cut any remaining non-word characters
    str = str.replace(/[^\w]+$/, "");

    var ellipsis = addEllipsis && str.length > 0 ? '&hellip;' : '';

    return(str + ellipsis);
}

var testString = "hi stack overflow, how are you? Spare";
var i = testString.length;

document.write('<strong>Without ellipsis:</strong><br>');

while(i > 0)
{
  document.write(i+': "'+ truncateStringToWord(testString, i) +'"<br>');
  i--;
}

document.write('<strong>With ellipsis:</strong><br>');

i = testString.length;
while(i > 0)
{
  document.write(i+': "'+ truncateStringToWord(testString, i, true) +'"<br>');
  i--;
}
0 голосов
/ 19 июня 2019

Вот еще один фрагмент кода, который усекается по знакам препинания (искал это, и Google нашел этот вопрос здесь).Пришлось придумать решение самостоятельно, вот что я взломал за 15 минут.Находит все вхождения.!?и усекает в любой позиции из них это <чем <code>len

function pos(str, char) {
    let pos = 0
    const ret = []
    while ( (pos = str.indexOf(char, pos + 1)) != -1) {
        ret.push(pos)
    }
    return ret
}

function truncate(str, len) {
    if (str.length < len)
        return str

    const allPos = [  ...pos(str, '!'), ...pos(str, '.'), ...pos(str, '?')].sort( (a,b) => a-b )
    if (allPos.length === 0) {
        return str.substr(0, len)
    }

    for(let i = 0; i < allPos.length; i++) {
        if (allPos[i] > len) {
            return str.substr(0, allPos[i-1] + 1)
        }
    }
}

module.exports = truncate
0 голосов
/ 26 августа 2015

Обновлено с @ NT3RP Я обнаружил, что если строка попадает в пробел в первый раз, это приведет к удалению этого слова, что сделает вашу строку на одно слово короче, чем может быть.Поэтому я просто добавил оператор if else, чтобы проверить, что maxLength не попадает в пробел.

codepen.io

var yourString = "The quick brown fox jumps over the lazy dog"; //replace with your string.
var maxLength = 15 // maximum number of characters to extract

if (yourString[maxLength] !== " ") {

//trim the string to the maximum length
var trimmedString = yourString.substr(0, maxLength);

alert(trimmedString)

//re-trim if we are in the middle of a word
trimmedString = trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(" ")))
}

else {
  var trimmedString = yourString.substr(0, maxLength);
}

alert(trimmedString)
0 голосов
/ 15 июля 2019

Вот решение в одной строке.

text = "this is a long string I cant display"

function shorten(text,max) {
    return text && text.length > max ? text.slice(0,max).split(' ').slice(0, -1).join(' ') : text
}


console.log(shorten(text,10));
0 голосов
/ 28 марта 2011

Вы можете обрезать пробелы с помощью этого:

var trimmedString = flabbyString.replace(/^\s*(.*)\s*$/, '$1');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...