Как ограничить сообщение в JavaScript? - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь написать простую функцию, чтобы обрезать данное сообщение до определенной длины, но в то же время не обрезать слова между ними и без пробелов в конце.

Пример:

Строка ввода : Быстрая коричневая лиса перепрыгнула через забор, K : 11

Выход : Быстрый

Вот что я попробовал:

  function crop(message, K) {
  var originalLen = message.length;
  if(originalLen<K)
  {
      return message;
  }
  else
  {
      var words = message.split(' '),substr;

      for(var i=words.length;i > 0;i--)
       {

           words.pop();

            if(words.join(' ').length<=K)
            {
              return words.join(' ');
            }
       }


  }
}

Эта функция отлично работает, но я не очень доволен ее реализацией.Нужны предложения по аспектам производительности, и будет ли случай, когда это не сработает?

Ответы [ 3 ]

2 голосов
/ 09 мая 2019

Этот получает работу без используя любой цикл for

function crop(message, K) {
  var originalLen = message.length;
  if(originalLen<K)
  {
      return message;
  }
  else
  {
    var words = message.split(' '); 
    var splitWords = message.substring(0, K).split(' ');

    if( words[splitWords.length - 1] != splitWords[splitWords.length - 1])
    	return splitWords.slice(0, splitWords.length - 1).join(' ');
    else
    	return splitWords.join(' ');
  }
}

var str = "The quick brown fox jumped over the fence";
console.log(crop(str, 11));
2 голосов
/ 09 мая 2019

Вы можете проверить длину новой строки и увеличить индекс для нарезки массива.

function crop(message, l) {
    var parts = message.split(/\s+/),
        i = 1;

    if (message.length < l) return message;
    while (parts.slice(0, i).join(' ').length < l) i++;
    return parts.slice(0, i - 1).join(' ');
}

console.log(crop('The quick brown fox jumped over the fence', 11)); // 'The quick'
1 голос
/ 10 мая 2019

Только что просмотрел ваш код!

Нина действительно хороший ответ!


Однако, это выражение может помочь вам сделать это:

([A-z0-9\s]{1,11})(\s)(.*)

Это выражение смягчено справа и имеет три группы захвата с только списком символов, которые я только что добавил в первую группу захвата, и я уверен, что вы, возможно, захотите изменить этот список, возможно, аналогично:

([A-Za-z0-9\s]{1,11})(\s)(.*)

Graph

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

enter image description here

Тест производительности

Этот фрагмент JavaScript показывает производительность этого выражения с помощью простого цикла for, равного миллиону раз.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = 'The quick brown fox jumped over the fence';
	const regex = /([A-z0-9\s]{1,11})(\s)(.*)/gm;
	var match = string.replace(regex, "$1");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");

Тестовый код

const regex = /([A-z0-9\s]{1,11})(\s)(.*)/s;
const str = `The quick brown fox jumped over the fence`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
...