Как преобразовать вложенные массивы со строками в числа в JavaScript?

Я не знаю, насколько глубоко мой массив. Возможно:

let array = ["1000", "5000", "3000"];

Или же:

let array = [ ["4000", "2000", "1000"], ["6000", "7000", "3000"] ];

Я хотел бы преобразовать их в реальные числа. Предпочтительным обработчиком является lodash. Но я ценю каждое решение.

То, что я попробовал, было:

let array = array.map(Number);

Но это покрывало одномерные массивы.

2 ответа

Решение

Использование Array#map метод с рекурсивным подходом для вложенного массива.

function conv(arr) {
  // iterate over the array
  return arr.map(function(v) {
    // if the element is an array call the function recursively
    // or parse the number and treat NaN as 0
    return Array.isArray(v) ? conv(v) : Number(v) || 0;
  })
}

const array = [
  ["4000", "2000", "1000", ""],
  ["6000", "7000", "3000"]
];
const array1 = ["1000", "5000", "3000"];

function conv(arr) {
  return arr.map(function(v) {
    return Array.isArray(v) ? conv(v) : Number(v) || 0;
  })
}

console.log(conv(array));
console.log(conv(array1));


С синтаксисом стрелки ES6:

let conv = arr => arr.map(v => Array.isArray(v) ? conv(v) : Number(v) || 0)

const array = [
  ["4000", "2000", "1000", ""],
  ["6000", "7000", "3000"]
];
const array1 = ["1000", "5000", "3000"];

let conv = arr => arr.map(v => Array.isArray(v) ? conv(v) : Number(v) || 0)

console.log(conv(array));
console.log(conv(array1));

Более общее решение будет версия map которая принимает любую функцию и работает с массивами или скалярами:

const maybeMap = fn => x => Array.isArray(x) ? x.map(maybeMap(fn)) : fn(x);

const numberify = maybeMap(Number);

const array = ["1000", ["2000", "3000"], "4000"];
console.log(numberify(array));

Другие вопросы по тегам