Перевести строку в массив и отделить все числа
Помогите решить задачу. Пример тестовых данных - let a = "00asdf0123 d6 lkj006m90" -> [0,0,0,123, 6, 0, 0, 6, 90] Ограничение: регулярные выражения в решении не используем. Есть код, но работает некорректно:
function extractNumbers(string) {
let arrNumbs = [];
let currentNumber = "";
for (let i = 0; i < string.length; i++) {
let char = string.charAt(i);
if (!isNaN(char)) {
currentNumber += char;
} else if (currentNumber !== "") {
arrNumbs.push(parseInt(currentNumber));
currentNumber = "0";
}
}
if (currentNumber !== "") {
arrNumbs.push(parseInt(currentNumber));
return arrNumbs;
}
}
let string = "sjkn00kdf012300 0d066m00900000";
let result = extractNumbers(string);
console.log(result);
Ответы (4 шт):
Автор решения: Евгений Ваулин
→ Ссылка
let a = "00asdf0123 d6 lkj006m90"
const sepFunc = (str) =>{
let arr = []
let resArr=[]
let tempStr =''
for(let i =0 ;i<=str.length;i++){
if(!isNaN(str[i])&&str[i]!==' '){
tempStr+=str[i]
}
else if(!tempStr){
continue
}
else{
arr.push(tempStr.trim())
tempStr=''
}
}
for(let i =0; i<arr.length;i++){
for(let j=0; j<arr[i].length;j++){
if(arr[i][j]==0){
resArr.push(+arr[i][j])
}
else{
resArr.push(+arr[i].slice(j))
break
}
}
}
console.log(resArr);
}
sepFunc(a)
Автор решения: megorit
→ Ссылка
let number = "";
let numbers = [];
let sequence = false;
for (const char of "sjkn00kdf012300 0d066m00900000") {
if (char >= '0' && char <= '9') {
if (char == '0' && !sequence) {
numbers.push(0);
} else {
sequence = true;
number += char;
}
} else {
sequence = false;
if (number) numbers.push(Number(number));
number = "";
}
}
if (number) numbers.push(Number(number));
console.log(numbers);
Автор решения: Stanislav Volodarskiy
→ Ссылка
Есть решение, которое обрабатывает строку посимвольно. Если стоит флаг push и символ - цифра, в массив-результат добавляется новое число. Если флаг push не установлен и символ цифра, эта цифра подмешивается в последнее число в массиве:
const extractNumbers = s => {
const a = [];
let push = true;
for (const c of s) {
if ('0' <= c && c <= '9') {
const d = c - '0';
if (push) {
a.push(d);
push = d === 0;
} else {
a[a.length - 1] = 10 * a[a.length - 1] + d;
}
} else {
push = true;
}
}
return a;
};
console.log(extractNumbers('sjkn00kdf012300 0d066m00900000'));
Автор решения: ksa
→ Ссылка
Предложу еще такой вариант...
console.log(test("00asdf0123 d6 lkj006m90"))
//
function test(str) {
const o = [...str].reduce((o, v) => {
if ('1234567890'.indexOf(v) === -1) {
if (o.v) o.a.push(+o.v), o.v = ''
return o
}
if (v === '0' && !o.v) return (o.a.push(0), o)
o.v += v
return o
}, {a: [], v: ''})
if (o.v) o.a.push(+o.v)
return o.a
}
Альтернативный вариант с другим методом и объектом...
console.log(test("00asdf0123 d6 lkj006m90"))
//
function test(str) {
const o = {a: [], v: ''}
const s = new Set('1234567890')
str = [...str]
str.forEach(v => {
if (s.has(v)) {
if (v === '0' && !o.v) return (o.a.push(0), o)
o.v += v
} else {
if (o.v) o.a.push(+o.v), o.v = ''
}
})
if (o.v) o.a.push(+o.v)
return o.a
}