将字符串每2个字符分割成数组

5

我的代码有问题。我有一系列的字符串。例如,我写了这个:

var a = 12345678

我想将这些字符串拆分成一个数组,使其产生类似以下的内容:
[12,23,34,45,56,67,78]

我已经尝试过这段代码:
var newNum = a.toString().match(/.{1,2}/g)

它返回了这个结果而不是我想要的结果

[12,34,56,78]

有没有解决方案?谢谢提前。

从一个简单的 for 循环或数组处理方法开始。仅使用正则表达式无法完成此操作。 - charlietfl
10个回答

5

最短的方法:

'abcdefg'.split(/(..)/g).filter(s => s);
// Array(4) [ "ab", "cd", "ef", "g" ]

解释: split(/(..)/g) 将字符串每两个字符分割一次(大致如此),我理解是任意两个字符的捕获组 (..) 在此作为顺序预查(出于我不知道的原因;如果有人有解释,欢迎对本答案进行贡献)。这将产生Array(7) [ "", "ab", "", "cd", "", "ef", "g" ],所以只要用filter(s => s)筛选掉空子字符串即可。


2
'abcdefg'.match(/(..)/g) 是一个更短的版本,但这不是Mohammand所要求的。 - luvejo

3
希望这能帮到你。

var a = 12345678;
a= a.toString();
var arr=[];
for (var i =0; i<a.length-1; i++) {
 arr.push(Number(a[i]+''+a[i+1]));
}

console.log(arr);

Output


2
谢谢Nick Parsons,我使用了Number()函数。 - javapedia.net
你可以在code snippet中添加你的代码,这会使答案更具交互性,老式的for循环+1。 - Code Maniac
码农,是的,我已经添加了代码片段。谢谢! - javapedia.net

3
您可以像这样使用Array.from()

let str = "12345678",
    length = str.length - 1,
    output = Array.from({ length }, (_,i) => +str.slice(i, i+2))

console.log(output)

这里提供了一种通用的解决方案,以获取不同大小的块:

function getChunks(number, size) {
  let str = number.toString(),
      length = str.length - size + 1;
      
  return Array.from({ length }, (_,i) => +str.slice(i, i + size))
}

console.log(getChunks(12345, 3))
console.log(getChunks(12345678, 2))


代码可以运行,但你能否请解释一下这段代码的含义: Array.from({ length }, (_,i) => +str.slice(i, i+2)) - Sizzling Code

0
我们可以使用 Array.reduce 来实现:
  • 首先,将数字转换为字符串,然后将其拆分成数组
  • 其次,在结果数组上应用 reduce,然后仅在下一个元素存在时附加当前元素 ele 与下一个元素。
  • 最后,在完成当前和下一个元素的附加后,通过在其前面添加算术运算符 + 并将其添加到累加器数组中来将其转换回数字。

var a = 12345678;

const result = a.toString().split("").reduce((acc, ele, idx, arr) => {
  return arr[idx + 1] ? acc.concat(+(ele + arr[idx + 1])) : acc;
}, []);
console.log(result);
console.assert(result, [12,23,34,45,56,67,78]);


0

这个模式是以前两位数字(12)开始,然后每次加十一,直到你得到一个以输入字符串的最后一位数字(8)结尾的数组。

let str = `12345678`;

const eleven = string => {
  let result = [];
  let singles = string.split('');
  let first = Number(singles.splice(0, 2).join(''));
  for (let i = 0; i < string.length-1; i++) {
    let next = 11 * i;
    result.push(first+next);
  }
  return result;
}
    
console.log(eleven(str));


0
你可以使用递归方法。这里我使用了一个辅助函数来执行递归,主函数用于将数字转换为字符串。
请参见下面的示例:

const arr = 12345678;

const group = a => group_aux(`${a}`);
const group_aux = ([f, s, ...r]) =>
  !s ? [] : [+(f+s), ...group_aux([s, ...r])];

console.log(group(arr));


0

我的要求是将一个长度为32的MD5字符串转换为长度为16的Uint8Array,作为AES算法的密钥。感谢上面帖子的参考。

var a = 'a12ab32fd78a89efa12ab32fd78a89ef';
var arr=[];
for (var i =0; i<a.length-1; i+=2) {
 arr.push(parseInt(a[i]+''+a[i+1], 16));
}

console.log(arr.length);
console.log(arr);
console.log(new Uint8Array(arr));


0

如果顺序不重要,一个更易读的解决方案是:

let even = '12345678'.match(/(..)/g)
let odd = '2345678'.match(/(..)/g)
let result = [...even, ...odd]

如果顺序很重要,只需使用 .sort()
result.sort()

0

另一种方法是使用reduce

var a = 12345678
a.toString()
 .split('')
 .reduce((c,x,i,A)=>i>0?c.concat([A[i-1]+A[i]]):c,[])

0
var a = 12345678;
console.log(
  String(a)
    .split("")
    .map((value, index, array) => [value, array[index + 1]].join(''))
    .map(item => Number(item))
);

output  - [ 12, 23, 34, 45, 56, 67, 78, 8 ]

解释

  • String(a) - 将数字值'a'转换为字符串,以准备进行操作
  • split("") - 将字符串值转换为数组
  • .map((value, index, array) => [value, array[index + 1]] ...

对于数组中的每个项目,取当前值和下一个值,并将它们放入数组单元格中

  • .join('')) - 然后从这个数组值创建字符串,如此 [ '1', '2' ] => ['12']

  • .map(item => Number(item)) - 最后,将每个数组项转换为数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接