通过计算字符长度将 JS 数组拆分并连接成块
Splitting and Concating a JS array into chunks by counting the length of characters
假设我有一个数组如下:
let inputArr = [
"Name: Jarina Begum↵Age: 70 years↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়মিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪।পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হোমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত ওষুধ বন্ধ করবেন না।"
];
我想从上面的数组创建一个新数组,其中每个元素的字符大小应该是 <=300.
所以,我必须一个接一个地连接元素,计算数组的character size
& index
,而连接字符串的大小超过限制[假设在这种情况下, 300];然后将其推入一个新数组,并从下一个索引开始计算字符,因为考虑字符的大小从 0.
循环将一直持续到 inputArr
的最后一个索引。
我还确定如果任何元素的大小为 >300,那么我必须以 300 的限制打破该元素。
预期输出如下:
[
"Name: Jarina Begum↵Age: 70 years↵↵Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵Savoy Sulphur Soap↵.১.৫ মাস -- নিয়মিত ব্যবহার করবেন।↵Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ২।সাধারন সাবান লাগাবেন না।, ৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ৪।পরিবারের সবার চিকিৎসা করতে হবে।, ৫।কবিরাজী ও হোমিওপাথি করবেন না, ৬।ডাক্তার এর পরামর্শ বাতিত ওষুধ বন্ধ করবেন না।"
];
所以,再一次,要求是短裤:
- 通过连接元素从给定数组创建一个新数组,新数组元素的字符大小应为<=300
- 如果给定数组的任意一个元素的字符大小>300以300为限将其打断拼接成给定数组,继续要求一。
您可以使用 .match
和 RegEx
以最佳方式做到这一点 -:
let charLimitArray = inputArr.join().match(/.{1,300}/g)
console.log(charLimitArray);
let inputArr = [
"Name: Jarina Begum↵Age: 70 years ↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়েমিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪। পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত অষুধ বন্দ করবেন না।"
];
console.log(inputArr.join().match(/.{1,300}/g))
希望这对您有所帮助...
另一种使用简单 for
循环的方法。
let inputArr = [
"Name: Jarina Begum↵Age: 70 years ↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়েমিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪। পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত অষুধ বন্দ করবেন না।"
];
let expectedArr = [];
let driverString = '';
var count = 0;
var length_= 0;
for(var i = 0; i < inputArr.length; i++){
length_ = inputArr[i]+ driverString;
if(length_.length <= 300 ){
driverString = driverString + inputArr[i];
}else{
driverString = '';
driverString = driverString + inputArr[i];
count++;
length_= 0;
}
expectedArr[count] = driverString;
}
console.log(expectedArr,expectedArr.length)
好的,感谢大家花时间解决我的问题,虽然没有达到我的要求。不管怎样,最后,我用传统的循环解决了它。
我写了三个函数来解决这个问题,一个函数是针对第一个需求,另外两个是针对第二个需求。
函数一:这里我传了两个参数,一个是给数组的,另一个是字符限制的长度。
在第一个函数中我调用了第二个函数,将给定的数组传递给那里,并将结果存储为输入数组。
const chunkSmsArr = (arr, len=300) => {
let inputArr = checkElLength(arr, len);
let outputArr = [],
msgString = '',
count = 0;
for(let i=0; i<inputArr.length; i++) {
if( (msgString+inputArr[i]).length <= len ) {
msgString += inputArr[i];
} else {
msgString = '';
msgString += inputArr[i];
count++;
}
outputArr[count] = msgString;
}
return outputArr;
}
函数二:这个函数检查给定数组的每一个元素,如果找到任何元素的长度>300,那么它调用第三个函数,将字符串打散成数组,拼接在当前迭代的位置。
const checkElLength = (inputArr, len) => {
let outputArr = [];
for(let i=0; i<inputArr.length; i++) {
if (inputArr[i].length > len) {
let breakedSmsArr = breakSmsArrString(inputArr[i], len);
inputArr.splice(i, 1, ...breakedSmsArr);
}
}
outputArr = inputArr;
return outputArr;
}
函数三:这里我也传了两个参数,一个是我需要拆分成数组元素的字符串,一个是字符限制的长度。
const breakSmsArrString = (str, len) => {
let curr = len, prev = 0;
let output = [];
while(str[curr]) {
if(str[curr++] == ' ') {
output.push(str.substring(prev,curr));
prev = curr;
curr += len;
} else {
let currReverse = curr;
do {
if(str.substring(currReverse - 1, currReverse) == ' ') {
output.push(str.substring(prev,currReverse));
prev = currReverse;
curr = currReverse + len;
break;
}
currReverse--;
} while(currReverse > prev)
}
}
output.push(str.substr(prev));
return output;
}
所以,现在您可以尝试使用 console.log
来查看输出:
console.log(chunkArr(inputArr, 300));
假设我有一个数组如下:
let inputArr = [
"Name: Jarina Begum↵Age: 70 years↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়মিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪।পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হোমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত ওষুধ বন্ধ করবেন না।"
];
我想从上面的数组创建一个新数组,其中每个元素的字符大小应该是 <=300.
所以,我必须一个接一个地连接元素,计算数组的character size
& index
,而连接字符串的大小超过限制[假设在这种情况下, 300];然后将其推入一个新数组,并从下一个索引开始计算字符,因为考虑字符的大小从 0.
循环将一直持续到 inputArr
的最后一个索引。
我还确定如果任何元素的大小为 >300,那么我必须以 300 的限制打破该元素。
预期输出如下:
[
"Name: Jarina Begum↵Age: 70 years↵↵Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵Savoy Sulphur Soap↵.১.৫ মাস -- নিয়মিত ব্যবহার করবেন।↵Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ২।সাধারন সাবান লাগাবেন না।, ৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ৪।পরিবারের সবার চিকিৎসা করতে হবে।, ৫।কবিরাজী ও হোমিওপাথি করবেন না, ৬।ডাক্তার এর পরামর্শ বাতিত ওষুধ বন্ধ করবেন না।"
];
所以,再一次,要求是短裤:
- 通过连接元素从给定数组创建一个新数组,新数组元素的字符大小应为<=300
- 如果给定数组的任意一个元素的字符大小>300以300为限将其打断拼接成给定数组,继续要求一。
您可以使用 .match
和 RegEx
以最佳方式做到这一点 -:
let charLimitArray = inputArr.join().match(/.{1,300}/g)
console.log(charLimitArray);
let inputArr = [
"Name: Jarina Begum↵Age: 70 years ↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়েমিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪। পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত অষুধ বন্দ করবেন না।"
];
console.log(inputArr.join().match(/.{1,300}/g))
希望这对您有所帮助...
另一种使用简单 for
循环的方法。
let inputArr = [
"Name: Jarina Begum↵Age: 70 years ↵↵",
"Tab. Mycofree (250 mg)↵১ + 0 + ১/২ টা -- ১.৫ মাস -- খাওয়ার পরে↵",
"Cap. Losectil (20 mg)↵১ + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার আগে↵",
"Tab. Rupin (10 mg)↵0 + 0 + ১ টা -- .১.৫ মাস -- খাওয়ার পরে↵",
"Savoy Sulphur Soap↵.১.৫ মাস -- নিয়েমিত ব্যবহার করবেন।↵",
"Advices:",
"১।নিয়মিত ওষুধ সেবন করবেন।, ",
"২।সাধারন সাবান লাগাবেন না।, ",
"৩।পরিধেয় জামা কাপড় Savlon/Detol দিয়ে ধুয়ে ফেলবেন, ",
"৪। পরিবারের সবার চিকিৎসা করতে হবে।, ",
"৫।কবিরাজী ও হমিওপাথি করবেন না, ",
"৬।ডাক্তার এর পরামর্শ বাতিত অষুধ বন্দ করবেন না।"
];
let expectedArr = [];
let driverString = '';
var count = 0;
var length_= 0;
for(var i = 0; i < inputArr.length; i++){
length_ = inputArr[i]+ driverString;
if(length_.length <= 300 ){
driverString = driverString + inputArr[i];
}else{
driverString = '';
driverString = driverString + inputArr[i];
count++;
length_= 0;
}
expectedArr[count] = driverString;
}
console.log(expectedArr,expectedArr.length)
好的,感谢大家花时间解决我的问题,虽然没有达到我的要求。不管怎样,最后,我用传统的循环解决了它。
我写了三个函数来解决这个问题,一个函数是针对第一个需求,另外两个是针对第二个需求。
函数一:这里我传了两个参数,一个是给数组的,另一个是字符限制的长度。
在第一个函数中我调用了第二个函数,将给定的数组传递给那里,并将结果存储为输入数组。
const chunkSmsArr = (arr, len=300) => {
let inputArr = checkElLength(arr, len);
let outputArr = [],
msgString = '',
count = 0;
for(let i=0; i<inputArr.length; i++) {
if( (msgString+inputArr[i]).length <= len ) {
msgString += inputArr[i];
} else {
msgString = '';
msgString += inputArr[i];
count++;
}
outputArr[count] = msgString;
}
return outputArr;
}
函数二:这个函数检查给定数组的每一个元素,如果找到任何元素的长度>300,那么它调用第三个函数,将字符串打散成数组,拼接在当前迭代的位置。
const checkElLength = (inputArr, len) => {
let outputArr = [];
for(let i=0; i<inputArr.length; i++) {
if (inputArr[i].length > len) {
let breakedSmsArr = breakSmsArrString(inputArr[i], len);
inputArr.splice(i, 1, ...breakedSmsArr);
}
}
outputArr = inputArr;
return outputArr;
}
函数三:这里我也传了两个参数,一个是我需要拆分成数组元素的字符串,一个是字符限制的长度。
const breakSmsArrString = (str, len) => {
let curr = len, prev = 0;
let output = [];
while(str[curr]) {
if(str[curr++] == ' ') {
output.push(str.substring(prev,curr));
prev = curr;
curr += len;
} else {
let currReverse = curr;
do {
if(str.substring(currReverse - 1, currReverse) == ' ') {
output.push(str.substring(prev,currReverse));
prev = currReverse;
curr = currReverse + len;
break;
}
currReverse--;
} while(currReverse > prev)
}
}
output.push(str.substr(prev));
return output;
}
所以,现在您可以尝试使用 console.log
来查看输出:
console.log(chunkArr(inputArr, 300));