2015-12-20 75 views
4

我有一大塊文本,我想將它分成一個數組,每個元素是一行最多50個字符。如果字符串包含\r\n,我希望它是一個元素本身(不是另一個字符串的一部分)。我對如何做到這一點感到困惑。如何在JavaScript中對字符串進行塊化處理?

我已經試過

lines = newVal.match(/^(\r\n|.){1,50}\b/g) 

我也試過下劃線/ lodash _.chunk但忽略的話明顯。 但是這隻給我第一場比賽。請幫忙。

+0

你需要保留現有的換行符嗎? – dandavis

+0

是的。我需要保留現有的換行符 – Shamoon

+7

你能給我們一些輸入/輸出的例子嗎? –

回答

3

試試這個:

result = lines.split(/(?=(\r\n))/g); 
result.forEach(function(item,index,arr) { 
    if(item.length > 50) { 
    var more = item.match(/.{1,50}\b/g); 
    arr[index] = more[0]; 
    for(var i=1; i<more.length; ++i) { 
     arr.splice(index+i, 0, more[i]);  
    } 
    } 
}); 

這將首先拆分文本通過您的新行的數組,然後去並進一步分解陣列中的長線,保持字。

+0

這個假設我已經有'行'。如果我不這樣做? – Shamoon

+0

我的意思是'lines'變量表示你的文本塊,如果不清楚的話,很抱歉,在你的例子中它被稱爲'newVal'。 – zpr

+0

仍......這不會尊重單詞的界限。我不想在一個詞的中間打破 – Shamoon

2

嘗試使用String.prototype.split()while循環,Array.prototype.some()Array.prototype.filter()String.prototype.slice()Array.prototype.splice()

// call `.split()` of `largeBlockOfText` with `RegExp` `/\r|\n/` 
var arr = largeBlockOfText.split(/\r|\n/); 
// while `arr` has element where `.length` greater than `50` 
while (arr.some(function(v) {return v.length > 50})) { 
    // filter element in `arr` where element has `.length` greater than `50` 
    var j = arr.filter(function(val, key) { 
    return val.length > 50 
    })[0] 
    // get index of `j` within `arr` 
    , index = arr.indexOf(j) 
    // text of `j` 
    , text = j 
    // index to insert block of 50 characters of `text` 
    , i = 1; 
    while (text.length) { 
    // insert block of 50 characters from `text` at `index` + 1 
    arr.splice(index + i, 0, text.slice(0, 50)); 
    // reset `text` 
    text = text.slice(50, text.length); 
    // increment `i` : `index` 
    ++i; 
    } 
    // remove `j` , reset `i` 
    arr.splice(index, 1); i = 1; 
} 
+0

plnkr http://plnkr.co/edit/RfK3EhUZamQHUdmzarvd?p=preview – guest271314

+0

這並不尊重單詞邊界。我不想在一個詞的中間打破 – Shamoon

2

先拆

newVal.split(/\b|(?=\n)|(?=\r)/) 

然後加入

.reduce(function(accum,x,i){ 
    if(x=="\n" 
    || x=="\r" 
    || (accum[accum.length-1]+x).length>50 
){ 
    accum.push(x); 
    } else { 
    accum[accum.length-1]+=x; 
    } 
    return accum; 
},[]) 

我沒有處理的話超過50個字符的情況下,但是這只是因爲它是不是真的應該明確發生什麼

+0

似乎沒有工作,雖然我不知道爲什麼 – Shamoon

+0

你是什麼意思的「不工作」?語法錯誤,意外的結果?... –

1

這裏只是一個ES6功能方法的示例(不可改變的意圖):

let _range = (count, step) => Array.apply(null, Array(count)).map((_, i) => (i * step)); 

let splitByLimit = function(limit = 10, string = '') { 
    let length = string.length; 

    if (length <= limit) { 
    return [string]; 
    } else { 
    let positions = _range(Math.ceil(length/limit), limit); 

    return positions.map(pos => string.slice(pos, pos + limit)); 
    } 
}; 

let getLines = function(string = '', limit = 10) { 
    let splitted = string.split(/\r|\n/); 
    let byLimit = splitByLimit.bind(null, limit); 
    let flatten = (memo, item) => memo.concat(item); 

    return splitted.map(byLimit).reduce(flatten, []); 
}; 

live jsbin

相關問題