Разделить строку на каждые 2 символа в массив

#javascript #arrays

#javascript #массивы

Вопрос:

У меня проблема с моим кодом. У меня есть последовательность строк. Например, я сделал это:

 var a = 12345678
  

Я хочу разделить эти строки в массив, чтобы получилось что-то вроде этого:

 [12,23,34,45,56,67,78]
  

Я уже пробовал этот код:

 var newNum = a.toString().match(/.{1,2}/g)
  

и это возвращает этот результат вместо результата, который я хотел

 [12,34,56,78]
  

Есть ли какое-либо решение для этого? Заранее спасибо.

Комментарии:

1. Начните с простого for цикла или метода обработки массива. Вы не можете сделать это с помощью одного регулярного выражения

Ответ №1:

Кратчайший способ:

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

Объяснение: split(/(..)/g) разбивает строку на каждые два символа (своего рода), насколько я понимаю, захваченная группа из любых двух символов (..) действует здесь как ориентир (по неизвестным мне причинам; если у кого-то есть объяснение, вклад в этот ответ приветствуется). Это приводит к Array(7) [ "", "ab", "", "cd", "", "ef", "g" ] так что все, что осталось сделать, это отсеять пустые подстроки с помощью filter(s => s) .

Комментарии:

1. 'abcdefg'.match(/(..)/g) это еще более короткая версия, хотя это не то, о чем просил Мохамманд.

Ответ №2:

Надеюсь, это поможет.

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

Вывод

Комментарии:

1. Спасибо Нику Парсонсу, я использовал функцию Number().

2. Вы можете добавить свой код в фрагмент кода , что делает ответ более интерактивным, 1 для старого цикла for

3. Кодовый маньяк, да, добавил фрагмент кода. Спасибо!

Ответ №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))  

Комментарии:

1. работает, но не могли бы вы, пожалуйста, объяснить это Array.from({ length }, (_,i) => str.slice(i, i 2))

Ответ №4:

Мы можем сделать это с помощью Array.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]);  

Ответ №5:

Другой подход, использующий reduce

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

Ответ №6:

Шаблон начинается с первых двух цифр (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 resu<
}
    
console.log(eleven(str));  

Ответ №7:

 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 ]
  

объяснение

  • Строка (a) — преобразуйте числовое значение ‘a’ в строку, чтобы подготовиться к операциям
  • split(«») — преобразовать строковое значение в массив
  • .map((значение, индекс, массив) => [значение, массив[индекс 1]] …

для каждого элемента из массива возьмите текущее значение и следующее значение и поместите их в ячейку массива

  • .join(«)) — затем создайте строку из этого значения массива следующим образом [ ‘1’, ‘2’ ] => [’12’]

  • .map(item => Number(элемент)) — в конце преобразуйте каждый элемент массива в число.

Ответ №8:

Вы могли бы использовать рекурсивный подход. Здесь я использовал вспомогательную функцию для выполнения рекурсии и основную функцию для преобразования числа в строку.

Смотрите пример ниже:

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

Ответ №9:

Мое требование состоит в том, чтобы преобразовать строку MD5 (длиной 32) в Uint8Array (длиной 16) в качестве ключа алгоритма 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));  

Ответ №10:

Если порядок не имеет значения, более разборчивым решением является:

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

Если порядок имеет значение, просто используйте .sort() :

 result.sort()