Javascript 在指定字符和最大长度(JS)处断开长字符串

Javascript 在指定字符和最大长度(JS)处断开长字符串,javascript,Javascript,也许有一个比我的更干净、更有效的安舍,但我找不到。所以我自己也试过了,到目前为止没有什么结果 var str=个人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、蓖麻、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁;//人名来自数组 var maxCount=100; var jki=Math.floorstr.length/maxCount; var i=0; arr=[]; var起始点=0; 而我所以我花了时间根据

也许有一个比我的更干净、更有效的安舍,但我找不到。所以我自己也试过了,到目前为止没有什么结果

var str=个人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、蓖麻、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁;//人名来自数组 var maxCount=100; var jki=Math.floorstr.length/maxCount; var i=0; arr=[]; var起始点=0;
而我所以我花了时间根据你的标准让它真正起作用。注释中解释了所有步骤

var str=人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度卡、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、里奇尔、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁; var maxCount=100; var splitNames=functionstr,最大值{ //[人:,艾米,伯莎,,…] 变量名称=str.split“”, 行=[], 直线=0, 线宽=0; //循环遍历我们的名称数组 name.forEachfunctionname{ //如果长度超过我们的最大值 iflineLength+name.length+1>最大值{ 行+=1;//移动到下一行 lineLength=0;//重置长度计数器 }否则{ lineLength+=1;//为稍后添加的空间添加1 } //如果没有空数组,请确保添加空数组 行[行]=行[行]| |[]; //添加当前名称 行[line].pushname; //将名称长度添加到行长度 lineLength+=name.length; }; 返回行.mapfunctionline{ //把我们的名字和一个空格连在一起,我们把空格数在长度上 返回行。加入“”; }; }
console.logsplitNamesstr,maxCount 所以我花了点时间让它按照你的标准工作。注释中解释了所有步骤

var str=人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度卡、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、里奇尔、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁; var maxCount=100; var splitNames=functionstr,最大值{ //[人:,艾米,伯莎,,…] 变量名称=str.split“”, 行=[], 直线=0, 线宽=0; //循环遍历我们的名称数组 name.forEachfunctionname{ //如果长度超过我们的最大值 iflineLength+name.length+1>最大值{ 行+=1;//移动到下一行 lineLength=0;//重置长度计数器 }否则{ lineLength+=1;//为稍后添加的空间添加1 } //如果没有空数组,请确保添加空数组 行[行]=行[行]| |[]; //添加当前名称 行[line].pushname; //将名称长度添加到行长度 lineLength+=name.length; }; 返回行.mapfunctionline{ //把我们的名字和一个空格连在一起,我们把空格数在长度上 返回行。加入“”; }; }
console.logsplitNamesstr,maxCount 你错过的东西很少。最重要的一点是,您应该从startPoint开始下一个切片,而不是从i*maxCount-maxCount开始。另一个大问题是lastIndexOf将从片段的开头开始计数,而不是从原始字符串的开头开始计数,对于除第一个片段以外的所有片段,原始字符串的开头将小于maxCount,然后小于startPoint。这就是为什么第二个块是空的。和第一个大片段相结合,它使最后一个块从say开始,就像它从前一个块中最后一个空格的位置开始一样

您还应该注意最后一块,不要被最后一个空格切断,因为末尾可能没有空格。还要注意那些可能没有空间的切片。最后,即使str.length/maxCount是整数,块的数量也可能不是Math.floorstr.length/maxCount

为了说明这一点,我采取了自由的方式来解决它,我看到你正在试图做什么

var str = "Persons: Amy, bertha, Charlie, Donkey, Evy, Felicia, Ghunter, Hercules, Indica, Jody, Katy, Linsay, Moony, Nigel, Opethry, Phil, Quinton, Ricial, Stefany, Trudy, Ursla, Vlinder, Wendy, Xion, Yvy, Zulu";
var maxCount = 100;
var jki = Math.floor(str.length / maxCount);
var arr = [];
var startPoint = 0;
while (startPoint < str.length) {
    while (startPoint < str.length && str[startPoint] == ',' ||  str[startPoint] == ' ') // chop leading commas and spaces off
    startPoint++;
    var nextSlice;
    var nextStart;
    if (startPoint + maxCount >= str.length) {
        // last chunk goes in completely
        nextSlice = str.slice(startPoint);
        nextStart = str.length;
    }
    else {
        // not last, chop of by last space if any
        nextSlice = str.slice(startPoint, startPoint + maxCount);
        nextStart = nextSlice.lastIndexOf(" ");
        if (nextStart <= 0) {
            nextStart = nextSlice.length;
        }
        else {
            nextStart -= 1;
        }
        nextStart += startPoint; // adjust for slice starting not at the beginning of str
     }
     arr.push(str.slice(startPoint, nextStart));
     startPoint = nextStart + 1;
}
console.log(arr);

你错过的东西很少。最重要的一点是,您应该从startPoint开始下一个切片,而不是从i*maxCount-maxCount开始。另一个大问题是lastIndexOf将从片段的开头开始计数,而不是从原始字符串的开头开始计数,对于除第一个片段以外的所有片段,原始字符串的开头将小于maxCount,然后小于startPoint。这就是为什么第二个块是空的。和第一个大片段相结合,它使最后一个块从say开始,就像它从前一个块中最后一个空格的位置开始一样

您还应该注意最后一块,不要被最后一个空格切断,因为末尾可能没有空格。还要注意那些可能没有空间的切片。最后,即使str.length/maxCount是整数,块的数量也可能不是Math.floorstr.length/maxCount

为了说明这一点,我选择了自由来修正 这是我看到你想做什么的方式

var str = "Persons: Amy, bertha, Charlie, Donkey, Evy, Felicia, Ghunter, Hercules, Indica, Jody, Katy, Linsay, Moony, Nigel, Opethry, Phil, Quinton, Ricial, Stefany, Trudy, Ursla, Vlinder, Wendy, Xion, Yvy, Zulu";
var maxCount = 100;
var jki = Math.floor(str.length / maxCount);
var arr = [];
var startPoint = 0;
while (startPoint < str.length) {
    while (startPoint < str.length && str[startPoint] == ',' ||  str[startPoint] == ' ') // chop leading commas and spaces off
    startPoint++;
    var nextSlice;
    var nextStart;
    if (startPoint + maxCount >= str.length) {
        // last chunk goes in completely
        nextSlice = str.slice(startPoint);
        nextStart = str.length;
    }
    else {
        // not last, chop of by last space if any
        nextSlice = str.slice(startPoint, startPoint + maxCount);
        nextStart = nextSlice.lastIndexOf(" ");
        if (nextStart <= 0) {
            nextStart = nextSlice.length;
        }
        else {
            nextStart -= 1;
        }
        nextStart += startPoint; // adjust for slice starting not at the beginning of str
     }
     arr.push(str.slice(startPoint, nextStart));
     startPoint = nextStart + 1;
}
console.log(arr);
var str=人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度卡、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、里奇尔、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁; var arr=str.split“”。映射词=>word.substr0,100.reduceac,word=>{ acc.length+=单词长度+1; 如果附件长度>100{ acc.length=word.length-1; 根据线路推[字]; }否则{ acc.lines[acc.lines.length-1].pushword; } 返回acc; },{lines:[[]],长度:-1}.lines.mapline=>line.join'; console.logarr var str=人:艾米、伯莎、查理、驴子、埃维、费利西亚、古特、大力士、印度卡、朱迪、凯蒂、林赛、穆尼、奈杰尔、奥佩特里、菲尔、昆顿、里奇尔、斯蒂芬、特鲁迪、厄斯拉、弗林德、温迪、雄、伊夫、祖鲁; var arr=str.split“”。映射词=>word.substr0,100.reduceac,word=>{ acc.length+=单词长度+1; 如果附件长度>100{ acc.length=word.length-1; 根据线路推[字]; }否则{ acc.lines[acc.lines.length-1].pushword; } 返回acc; },{lines:[[]],长度:-1}.lines.mapline=>line.join';
console.logarr;看看这个:所以当字符串长度超过100个字符和/或它看到一个特定的字符时,你就尝试拼接它?哪个角色?你想让下一个字符串从该字符开始还是旧字符串从该字符结束?@Mojtaba和如何知道极限参数?@8protons这是我的目标:arr=[str maxLen 100,str maxLen 100],str maxLen 100,str maxLen 100]例如str为301-400个字符long@PhilAndelhofs是的,但您编写了希望字符串以特定字符结尾的命令。哪个角色?字母“c”?一个“?”符号?看看这个:当字符串长度超过100个字符和/或它看到一个特定的字符时,你试图拼接它?哪个角色?你想让下一个字符串从该字符开始还是旧字符串从该字符结束?@Mojtaba和如何知道极限参数?@8protons这是我的目标:arr=[str maxLen 100,str maxLen 100],str maxLen 100,str maxLen 100]例如str为301-400个字符long@PhilAndelhofs是的,但您编写了希望字符串以特定字符结尾的命令。哪个角色?字母“c”?一个“?”的标志?第一眼看到比我自己的好!谢谢你抽出时间!这样更好!没问题!这是一个有趣的挑战:第一眼比我自己的好!谢谢你抽出时间!这样更好!没问题!这是一个有趣的挑战:不用担心!正如ShamSUP已经指出的,这是一个有趣的挑战:不用担心!正如ShamSUP已经指出的,这是一个有趣的挑战: