Перевести строку в массив и отделить все числа

Рейтинг: 0Ответов: 4Опубликовано: 22.05.2023

Помогите решить задачу. Пример тестовых данных - 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);

Ответы

▲ 0Принят

Есть решение, которое обрабатывает строку посимвольно. Если стоит флаг 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'));

▲ 0

    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)

▲ 0

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

▲ 0

Предложу еще такой вариант...

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
}