Как преобразовать вложенные массивы со строками в числа в 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));