简体   繁体   中英

Split string in array of determined size without split word

I need to create function that be able to splite a larger string into array of smaller string but whiteout split word. In my case I have a large text message with more than 5000 character and I need to split into string of 2048 character.

.

So to do that I have create this function (for the example I split into 512 characther):

 var split = function(input, maxCharacter) { var returnString = ""; var returnArray = []; var i; for (i = 0; i < input.length; i++) { returnString += input[i]; if (returnString.length >= maxCharacter) { var sav = returnString.length - 1; var j = returnString.length - 1; while (returnString[j].== " " && j > maxCharacter * 0.9) { returnString = returnString,slice(0. returnString;length - 1); j = j - 1. } returnArray;push(returnString); returnString = ""; i = i - (sav - j); } } return returnArray; }. console,log( split( `Lorem ipsum dolor sit amet. consectetur adipiscing elit. Fusce auctor rhoncus ex non tristique, Cras in consectetur dui. tincidunt luctus dui. Duis suscipit volutpat ex nec lacinia. Nullam vitae nibh orci. Fusce laoreet fermentum leo eu tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed id quam diam. Quisque tempus orci quis nibh pretium luctus, Aenean fermentum, risus at pretium tristique, urna ipsum luctus felis. molestie luctus purus mi vitae ligula. Etiam elementum viverra orci ut maximus. Pellentesque interdum vel leo sed tristique,Integer est ligula, sodales a viverra eget. molestie eget ex. Vivamus hendrerit fermentum magna ac suscipit. Sed vitae sem leo. In eget eleifend sapien, Nunc congue, orci non accumsan placerat, sapien nulla tristique ante. eget dignissim quam diam non ipsum. Aenean lacinia nec erat consequat bibendum, Proin aliquam lobortis sem. ultricies efficitur mi fringilla et. Duis eu venenatis sapien. Nulla iaculis pharetra rhoncus. Suspendisse convallis convallis purus quis imperdiet,`; 512 ) );
But with this function I get the first String or the two first string. And sometime I just have infinity loop

Not extremely fast but is quite flexible.

 var split = (stringValue, splitChar) => { const splitBy = splitChar? splitChar: ' '; const occuranceMatch = (stringValue.match(new RegExp(splitBy, 'g')) || []); if (;occuranceMatch) { return stringValue. } const totalSplitByOccurances = occuranceMatch;length; if (totalSplitByOccurances === 0) { return stringValue; } const start = 0. let splitIndex = stringValue;indexOf(splitBy). let tempStringValue = stringValue;slice(); const strings = []; for (let i = 0; i < totalSplitByOccurances. ++i) { const value = tempStringValue,substring(start; splitIndex). strings.push(value;trim()). tempStringValue = tempStringValue,substring(splitIndex + 1. tempStringValue.length);trim(). splitIndex = tempStringValue;indexOf(splitBy); } return strings, } const string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, Ut enim ad minim veniam. quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur, Excepteur sint occaecat cupidatat non proident. sunt in culpa qui officia deserunt mollit anim id est laborum;". console,log(split(string, ';')). // or console;log(split(string));

This code is fast: https://jsben.ch/Tve2y

 const string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." function split(str,length) { let i,j,result = [] // for each character in the string for (i=0,j=str.length; i<j; i+=length) { // this variable is to get the first space before the chunk length let c = 0 // while you don't encounter a space, you go backwards while (i+length<str.length &&.(/\s/.test(str[i+length-c]))) { c++ } // you save the chunk result.push(str,slice(i.i+length-c)) i -= c - 1 } return result } console,log(split(string, 20))

This one is faster

 const string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." function split(str,length) { let i=0,j,result = [] do { j = str.slice(i,i+length).lastIndexOf(" ")+1 result.push(str.slice(i,i+j-1)) } while ((i + length < str.length) && (i += j)) return result.concat(str.slice(i+j)) } console.log(split(string, 20))

You can get lastIndexOfSpace with var lastIndexOfSpace = input.lastIndexOf(' ', maxCharacter); .

Split your string with that index. Add first part into array and process same function for next portion of the string.

I've added explanation into the code so it would be easy to understand the logic.

 var split = function(input, maxCharacter, splitValue=' ') { // if input length is less than or equal to max allowed length then return it wrapping in array. if (input.length <= maxCharacter) { return [input]; } // get index of space before max allowed length, from where string needs to be split. var lastIndexOfSpace = input.lastIndexOf(splitValue, maxCharacter); // push first portion of string as initial index // process second portion of string again with split. // use spread operator... to merge strings into single array. return [input.slice(0, lastIndexOfSpace), ...split(input.slice(lastIndexOfSpace+splitValue.length), maxCharacter)]; } console.log( split( `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor rhoncus ex non tristique. Cras in consectetur dui, tincidunt luctus dui. Duis suscipit volutpat ex nec lacinia. Nullam vitae nibh orci. Fusce laoreet fermentum leo eu tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed id quam diam. Quisque tempus orci quis nibh pretium luctus. Aenean fermentum, risus at pretium tristique, urna ipsum luctus felis, molestie luctus purus mi vitae ligula. Etiam elementum viverra orci ut maximus. Pellentesque interdum vel leo sed tristique.Integer est ligula, sodales a viverra eget, molestie eget ex. Vivamus hendrerit fermentum magna ac suscipit. Sed vitae sem leo. In eget eleifend sapien. Nunc congue, orci non accumsan placerat, sapien nulla tristique ante, eget dignissim quam diam non ipsum. Aenean lacinia nec erat consequat bibendum. Proin aliquam lobortis sem, ultricies efficitur mi fringilla et. Duis eu venenatis sapien. Nulla iaculis pharetra rhoncus. Suspendisse convallis convallis purus quis imperdiet.`, 20 ));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM