通过计算字符长度将 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 দিয়ে ধুয়ে ফেলবেন, ৪।পরিবারের সবার চিকিৎসা করতে হবে।, ৫।কবিরাজী ও হোমিওপাথি করবেন না, ৬।ডাক্তার এর পরামর্শ বাতিত ওষুধ বন্ধ করবেন না।"
];

所以,再一次,要求是短裤:

  1. 通过连接元素从给定数组创建一个新数组,新数组元素的字符大小应为<=300
  2. 如果给定数组的任意一个元素的字符大小>300以300为限将其打断拼接成给定数组,继续要求一。

您可以使用 .matchRegEx 以最佳方式做到这一点 -:

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));