使用JavaScript将文本换行到更多行

使用JavaScript将文本换行到更多行,javascript,jquery,Javascript,Jquery,在这里,我试图通过比较字符串的长度来包装下拉列表中选择的值。我在申请第一行时使用的代码。如何通过比较第二行和下一行的字符串长度来应用相同的逻辑。下面是我正在使用的一些示例,如果我的Item.value.length=81,该怎么办 var selectedItemLength = Math.round(((Item.bounds.width) / (state.style.fontSize * (0.512 * scale))) * (pfConstants.LINE_HEIGHT))

在这里,我试图通过比较字符串的长度来包装下拉列表中选择的值。我在申请第一行时使用的代码。如何通过比较第二行和下一行的字符串长度来应用相同的逻辑。下面是我正在使用的一些示例,如果我的
Item.value.length=81
,该怎么办

var selectedItemLength = 
    Math.round(((Item.bounds.width) / (state.style.fontSize * (0.512 * scale))) * (pfConstants.LINE_HEIGHT));
//Here selectedItemLength gives 32
if (selectedItemLength < Item.value.length) {
  Item.value = 
    Item.value.substring(0, selectedItemLength) 
      + "\n" 
      + Item.value.substring(selectedItemLength, Item.value.length);
}
var selectedItemLength=
数学圆(((Item.bounds.width)/(state.style.fontSize*(0.512*刻度))*(pfConstants.LINE_HEIGHT));
//这里selectedItemLength给出32
if(selectedItemLength
注意:一个好的CSS规则可能会解决您的问题,不需要JS。调查财产

继续代码

首先,我建议在单独的函数中隔离您的关注点。在您的代码片段中,您将涉及一些不同的内容,例如
Item.bounds.width
Item.value
。最好将这些函数传递给函数对其进行操作,并将结果返回给对象。我理解你问题的核心,你想要一个函数,比如:

function(str: string,
         chunkLength: number,
         delimiter: string = "\n",
         maxLines: number = 3) { /* code */ }
该功能需要:

  • 将str分成给定大小的块
  • 只取行大小允许的尽可能多的块
  • 用分隔符将它们连接在一起
您可以在上述代码段中调用此函数:

Item.value = demoFunction(Item.value,selectedItemLength);
请记住,当您询问时(以及在我编写解决方案时),您忽略了空格。这将把单词或标记分开,而不考虑空格。这可能不是所希望的。即

testFunction("teal mittens", 8) == "teal mit\ntens";
强制性解决方案 正如您所提到的,这是一个有状态的for循环

var demoImperative = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
  var chunks = [];
  for (var index = 0; index < str.length && chunks.length < maxLines; index += chunkLength) {
    // NOTE: substr != substring. See https://stackoverflow.com/questions/3745515/what-is-the-difference-between-substr-and-substring
    chunks.push(str.substr(index, chunkLength));
  }
  return chunks.join(delimiter);
}
当然是简明扼要,如果有点不清楚的话。
.match()
进行拆分,
.slice()
仅获取正确的行数,
.join()
将数组恢复为字符串

拉姆达溶液 这一个使用了一个函数库,它使js中的数据转换(您在这里所做的)更加简单。我写这个是为了好玩

var demoRamda = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
  return R.pipe(
    R.splitEvery(chunkLength),
    R.take(maxLines),
    R.join(delimiter)
  )(str);
}

清晰简单,但这需要ramda.js库。除非您在服务器端执行此操作(不太可能),否则这一操作包含一个巨大的实用程序库是过分的,所以我建议不要执行此操作。

重新评估
Item.value.substring(selectedItemLength,Item.value.length)使用相同的逻辑拆分第二行,然后将其余部分添加到第一行(将以
blablabalabalabla\nblablablabal\n
结尾,因此只需冲洗和重复)@LordNeo我们可以用于循环吗?因为我的值最多只能显示3行。那么,使用for循环是否是一种好的做法呢?如果是,我如何使用它?可能是
var demoRamda = function(str, chunkLength, delimiter = "\n", maxLines = 3) {
  return R.pipe(
    R.splitEvery(chunkLength),
    R.take(maxLines),
    R.join(delimiter)
  )(str);
}