Как перевести строку в массив и оставить только цифры JavaScript?

Требуется все числа, которые встречаются в строке, поместить в отдельный целочисленный массив. Функция должна возвращать этот массив.

Например: "djhf117 gf4 h008dbsh79".
При том что регулярные выражения нельзя использовать. Должно возвращать массив чисел [117,4,0,0,8,79]

Пример: введите сюда код

let math = 'djhf117 gf4 h008dbsh79';

let array = function(string) {
    let inputArray =[];
    let  outArray = [];
    for (let i = 0; i < string.length; i++) {
        let array = parseInt(string[i]);
        if(!isNaN(array)) {
            outArray+=array;
            if(isNaN(array[i+1]) || array[i+1] || array[i+1] == true) {
                inputArray.push(outArray);
                //  outArray.push(array);
                // console.log(inputArray);
            }
        }
    }
    return inputArray;
}

console.log(array(math));


Ответы (4 шт):

Автор решения: SwaD

let math = 'djhf117 gf4 h008dbsh79';

function getNumbers() {
    const numArray = []; // Возвращаемый результат
    let numStr = ''; // Аккумулятор для цифр
    for (let i = 0; i < math.length; i++) {
        if (!isNaN(Number(math[i]))) { // Если символ является числом
            if (math[i] === '0') { // Если это 0, сразу добавляем в массив
                numArray.push(Number(math[i]))
            } else { // Это не ноль, добавляем в аккумулятор
                numStr += math[i]
            }
        } else { // Встретилось не число
            if (numStr.length) { // Если в аккумуляторе что то есть, пушим
                numArray.push(Number(numStr));
                numStr = ''; // и зануляем аккумулятор
            }
        }
    }
    return numArray;
}

console.log(getNumbers())

→ Ссылка
Автор решения: MrYogurt

Такой вариант думаю будет попроще:

const someString = 'djhf117 gf4 h008dbsh79';

const getAllNumbers = str => {
  const result = [];

  str.split('').reduce((acc, curr, index) => { // дробим строку на массив и начинаем прогон
    if (Number(curr)) { // проверяем, что элемент является number или 0 (чтобы обойти falsey)
      if (index === str.length - 1) { // если у нас последний элемент строки, тогда пушим то, что имеем
        result.push(Number(acc += curr));
      }

      return acc ? acc += curr : curr; // если acc не undefined, тогда плюсуем к нему взятый элемент, иначе установливаем значение аккумулятора
    }

    if (acc) { // если curr не является числом, тогда пушим готовый аккумулятор в result
      result.push(Number(acc));
    }

    if (curr === '0') { // предположительно ошибочная проверка
      result.push(Number(curr));
    }
  }, undefined); // инициализируем значение аккумулятора

  return result;
}

console.log(getAllNumbers(someString));

→ Ссылка
Автор решения: EzioMercer

В ответах SwaD и MrYogurt есть проблемы с обработкой нуля. Если вместо последовательности '008' будет последовательность '1008', то в результатах не увидите число 1008

Предлагаю очень простой алгоритм без этого недочёта (и как по мне с более читабельным кодом):

  1. Является ли символ числом или нет, я вместо преобразований, предлагаю использовать проверку с помощью кода символа строки. Код 48 отвечает за символ нуля, потому при проверке стоит строгое неравенство

  2. Объявляем массив, куда будем класть все числа

  3. Объявляем переменную, куда будем складывать по одному символы, отвечающие за цифры

  4. С помощью цикла for of перебираем по одному все символы строки:

    4.1. Если символ - это цифра и не ноль, то добавляем его в переменную строку иначе переходим к следующему символу

    4.2. Если символ - это ноль, то смотрим на пустоту переменной строки. Если она пустая, значит мы встретили одиночный ноль, а значит надо его просто добавить в массив. Если она не пустая, то значит мы встретили ноль, который является продолжением другого числа, значит надо добавить в переменную строку. Переходим к следующему символу

    4.3. Если встретили не цифру, то смотрим на пустоту переменной строки, если она пустая, то переходим к следующему символу, а если не пустая, то добавляем в массив преобразовав его в число

  5. Если после окончания цикла у нас переменная строка осталась не пустой, то добавлем это в массив преобразовав его в число

  6. Возвращаем массив

Код:

const isDigitButNotZero = (symbol) => {
  const code = symbol.charCodeAt(0);

  return code > 48 && code <= 57;
}

const getNums = (str) => {
  const nums = [];
  let num = '';

  for (const symbol of str) {
    if (isDigitButNotZero(symbol)) {
      num += symbol;
      
      continue;
    }
    
    if (symbol === '0') {
      if (num !== '') num += symbol;
      else nums.push(+num);
      
      continue;
    }

    if (num !== '') {
      nums.push(+num);
      num = '';
    }
  }

  if (num !== '') nums.push(+num);

  return nums;
}

const nums1 = getNums('djhf117 gf4 h008dbsh79');
const nums2 = getNums('djhf117 gf4 h1008dbsh79');

console.log(nums1);
console.log(nums2);

→ Ссылка
Автор решения: Rudi

Можно что-то такое сделать..

let m = 'djhf117 gf4 h008db0101sh79h7';

function f(m) {
  let res = [], str = '';
  for (let i = 0; i < m.length; i++) {
    if (isNaN(m[i])) continue;
    if (str == '' && m[i] == 0) { res.push(+m[i]); continue }
    str += m[i];
    if (isNaN(m[i + 1])) { res.push(+str); str = ''; i++ }        
  }
  return res
}
console.log(f(m));

→ Ссылка