Как разбить() строку на массив целых чисел
У меня есть строка, которая должна быть выполнена как массив:
var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',');
Если я использую split()
, он создаст массив строк:
[‘The’, '1', '2', ‘Fox’, ‘Jumped’, '3', ‘Over’, '4']
и мне это не нужно. Мне нужен массив вроде:
[‘The’, 1, 2, ‘Fox’, ‘Jumped’, 3, ‘Over’, 4]
указывающий, какая строка является номером.
Ответы
Ответ 1
Один параметр использует конструктор Number
, который возвращает число или NaN
:
var res = q.split(',').map(el => {
let n = Number(el);
return n === 0 ? n : n || el;
});
// > "The, 1, 2, Fox, Jumped, 3.33, Over, -0"
// < ["The", 1, 2, " Fox", " Jumped", 3.33, " Over", -0]
edit: Если вышеуказанное условие запутывает, вы можете заменить его следующим условием, которое было предложено Берги:
return isNaN(n) ? el : n;
Если вы хотите обрезать элементы строки, вы также можете использовать метод String.prototype.trim
:
return isNaN(n) ? el.trim() : n;
Ответ 2
//from the linked SO answer
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.trim().split(/\s*,\s*/).map(function(word) {
return isNumeric(word) ? Number(word) : word;
});
console.log(z);
Ответ 3
var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',');
Вы можете использовать Array.map, который возвращает новый массив
var newAr = z.map(item => parseInt(item) ? parseInt(item) : item);
Выведет
[ "The", 1, 2, "Fox", "Jumped", 3, "Over", 4]
Ответ 4
Это может быть достигнуто путем итерации по каждому элементу массива (разделение с помощью символа ,
) и использование функции map(predict)
, Затем каждый из элементов можно проверить, если они обрабатываются как int.
var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',').map(i => !isNaN(parseInt(i)) ? parseInt(i) : i);
Гольф::)
p=parseInt,q="The, 0 , 2, Fox, Jumped, 3, Over, 4",z=q.split(',').map(i=>!isNaN(p(i))?p(i):i);
Ответ 5
Я опаздываю, но проверю все ответы, и никто не изучил все случаи вроде: 1.3
, 11 Balls
.. и т.д. Кроме того, вы не trim
добавляли лишние пробелы для слов и должны быть включены иначе мы не сможем получить желаемый результат по запросу OP.
И parseFloat
намного лучше, потому что вы не теряете десятичные знаки:
var q = "The, 1, 2 fd, Fox, 3.12, Jumped, -3, Over, 4";
var z = q.split(',').map(function(i){
i = i.trim();
var reg = /^-?\d+\.?\d*$/;
if (reg.test(i))
return parseFloat(i);
return i;
});
console.log(z);
Результат:
["The", 1, "2 fd", "Fox", 3.12, "Jumped", -3, "Over", 4]
См. Fiddle
Ответ 6
Способ, который использует преобразование +string
в число.
var q = "The, 1, 2, Fox, Jumped, 3, Over, 0";
var r = q.split`, `.map(x=>+x||x==0?+x:x);
console.log(r);
Ответ 7
- Вы можете использовать функцию
Number
, чтобы преобразовать строку с строкой в фактическое число.
- Функция
Number
возвращает NaN
, если она не может преобразовать строку в число.
Вы можете использовать эти два факта в наших интересах и написать что-то вроде этого
"The, 1, 2, Fox, Jumped, 3, Over, 4".split(/\s*,\s*/g).map(d => Number(d) || d);
// [ 'The', 1, 2, 'Fox', 'Jumped', 3, 'Over', 4 ]
Так как NaN
является Falsy (Boolean(NaN)
is false
), если Number
не может преобразовать строку в число, фактическое значение будет возвращено как есть.
Ответ 8
Я пробовал цикл с forEach
и проверял номер или нет с помощью isNaN:return true if not number,return false if number
нажимаем новый массив...
var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = [];
q.split(',').forEach(function(v,k){
isNaN(v) ? z.push(v) : z.push(parseInt(v));
});
console.log(z);
Ответ 9
Вы можете использовать цикл for..of
, .test()
с /\d/
как параметр
var res = []; for (p of q.split(",")) [...res] = [...res, /\d/.test(p) ? +p : p];