Как разбить() строку на массив целых чисел

У меня есть строка, которая должна быть выполнена как массив:

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