#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()