如何用JavaScript限制消息的字符数?

时间:2019-05-09 19:59:42

标签: javascript arrays regex performance regex-group

我正在尝试编写一个简单的函数,以将给定的消息裁剪为特定的长度,但同时不要剪切中间的单词,并且最后不要尾随空格。

示例:

输入字符串:快速的棕色狐狸跳过了围栏, 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 个答案:

答案 0 :(得分:2)

您可以检查新字符串的长度,并增加用于切片数组的索引。

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 :(得分:2)

这可以使用任何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 :(得分:1)

只需查看您的代码!

Nina的答案非常好!


但是,this expression可能会帮助您做到这一点:

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

此表达式从右侧放宽,并具有三个捕获组,其中只有我刚刚在第一个捕获组中添加的字符列表,我确定您可能想要更改该列表,也许类似于:

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

此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

性能测试

此JavaScript代码段使用简单的100万次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);