如标题所述,我有一个字符串,想将其分成每个n个字符一段。
例如:
var str = 'abcdefghijkl';
经过一些神奇的操作,n=3
将变为
var arr = ['abc','def','ghi','jkl'];
有没有一种方法来做到这一点?
如标题所述,我有一个字符串,想将其分成每个n个字符一段。
例如:
var str = 'abcdefghijkl';
经过一些神奇的操作,n=3
将变为
var arr = ['abc','def','ghi','jkl'];
有没有一种方法来做到这一点?
const input = 'abcdefghijlkm';
// Change `3` to the desired split length.
const output = input.split('').reduce((s, c) => {
let l = s.length-1;
(s[l] && s[l].length < 3) ? s[l] += c : s.push(c);
return s;
}, []);
console.log(output); // output: [ 'abc', 'def', 'ghi', 'jlk', 'm' ]
Array.reduce
迭代每个字符。通常情况下,reduce
会返回一个单一的值,但在这种情况下,单一的值恰好是一个数组,当我们遍历每个字符时,我们将其附加到该数组中的最后一项。一旦数组中的最后一项达到目标长度,我们就会附加一个新的数组项。function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}
replace(/.{1,75}/g, '$&\n')
。 - alex在这里,我们将一个字符串与另一个字符串每n个字符交替出现:
export const intersperseString = (n: number, intersperseWith: string, str: string): string => {
let ret = str.slice(0,n), remaining = str;
while (remaining) {
let v = remaining.slice(0, n);
remaining = remaining.slice(v.length);
ret += intersperseWith + v;
}
return ret;
};
console.log(splitString(3,'|', 'aagaegeage'));
在这里我们做同样的事情,但是将其推入一个数组中:aag|aag|aeg|eag|e
export const sperseString = (n: number, str: string): Array<string> => {
let ret = [], remaining = str;
while (remaining) {
let v = remaining.slice(0, n);
remaining = remaining.slice(v.length);
ret.push(v);
}
return ret;
};
然后运行它:
console.log(sperseString(5, 'foobarbaztruck'));
如果有人知道简化上述代码的方法,请告诉我,但它应该适用于字符串。[ 'fooba', 'rbazt', 'ruck' ]
稍晚参与讨论,但这里有一个比子字符串+数组推送更快的变体。
// substring + array push + end precalc
var chunks = [];
for (var i = 0, e = 3, charsLength = str.length; i < charsLength; i += 3, e += 3) {
chunks.push(str.substring(i, e));
}
function str_split(string, length = 1) {
if (0 >= length)
length = 1;
if (length == 1)
return string.split('');
var string_size = string.length;
var result = [];
for (let i = 0; i < string_size / length; i++)
result[i] = string.substr(i * length, length);
return result;
}
str_split(str, 3)
我正在寻找一种将数字如1000000
转换为1,000,000
的解决方案,但绝对不想一直运行繁重的正则表达式操作,以减缓我的代码速度。
Alex的解决方案非常完美(在所有基于正则表达式的解决方案中!)。我已经修改并封装了一个函数,可以将数字格式化为千位分隔符数字:
function thouSep(str, delim=","){
var chunks = [];
str+=""
for (var i = str.length; i >0; i -= 3) {
chunks.push(str.substring(i-3, i));
}
f = chunks.reverse().join(delim)
return f
}
使用方法:
thouSep(100000) => "100,000"
thouSep(10000) => "10,000"
thouSep(10) => "10"
thouSep(1000000) => "1,000,000"
thouSep("Fabulous", "-") => "Fa-bul-ous"
可能的改进:
12345.6789
=> 12,345.6789
function groupChars(str = "ABCDEFGHI",inGroupsOf = 3){
let groups = [];
for (let i = 0; i < str.length; i++) {
(i%inGroupsOf) == 0 ? groups.push(str.slice(i,inGroupsOf + i)):null
}
return groups;
}
console.log(groupChars("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
groupChars
接受两个参数 - str
和inGroupsOf
。
inGroupsOf
参数确定每个组包含的字符数。
let groups = [];
for
循环遍历字符串inGroupsOf
参数是否为零:(i % inGroupsOf) == 0;
一些不使用正则表达式的简洁解决方案:
/**
* Create array with maximum chunk length = maxPartSize
* It work safe also for shorter strings than part size
**/
function convertStringToArray(str, maxPartSize){
const chunkArr = [];
let leftStr = str;
do {
chunkArr.push(leftStr.substring(0, maxPartSize));
leftStr = leftStr.substring(maxPartSize, leftStr.length);
} while (leftStr.length > 0);
return chunkArr;
};
使用示例 - https://jsfiddle.net/maciejsikora/b6xppj4q/。
我还尝试将我的解决方案与正则表达式进行比较,后者被选为正确答案。一些测试可以在 jsfiddle 上找到 - https://jsfiddle.net/maciejsikora/2envahrk/。测试显示两种方法具有类似的性能,也许乍一看正则表达式解决方案略快,但请您自行判断。
var b1 = "";
function myFunction(n) {
if(str.length>=3){
var a = str.substring(0,n);
b1 += a+ "\n"
str = str.substring(n,str.length)
myFunction(n)
}
else {
if(str.length>0){
b1 += str
}
console.log(b1)
}
}
myFunction(4)