Reputation: 799
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
)
);
Upvotes: 1
Views: 116
Reputation: 531
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));
Upvotes: 2
Reputation: 2137
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))
Upvotes: 1
Reputation: 12619
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
));
Upvotes: 1