У меня есть строка, содержащая сочетание символов и цифр. Я хочу отделить числа от строки и сохранить их в массиве. До сих пор мне удавалось отделять строки и числа и помещать их в массив, а затем получать только числа, но данные строкового типа — NaN. Я не могу избавиться от значений NaN из массива.

Пока мой код выглядит так:

arrayList = "abcd_456_yasdb_382_h_83_2";
new_arrayList = arrayList.split('_');
console.log(new_arrayList); // Output : [ 'abcd', '456', 'yasdb', '382', 'h', '83', '2' ]


new_arrayList = new_arrayList.map(Number);
console.log(new_arrayList); // Output :  [ NaN, 456, NaN, 382, NaN, 83, 2 ]

onlyNumArray = []

for(i =0; i<new_arrayList.length; i++) {
    // console.log(new_arrayList[i]);
    if(typeof (new_arrayList[i]) === "number" && typeof(new_arrayList[i]) != NaN) {
        onlyNumArray.push(new_arrayList[i])
    }
    else {
        console.log("Not a number")
    }
}
console.log(onlyNumArray)  // Output : [ NaN, 456, NaN, 382, NaN, 83, 2 ]

Output = [ NaN, 456, NaN, 382, NaN, 83, 2 ]
Expected Output = [456, 382,83,2]
1
Cpt Kitkat 26 Янв 2022 в 17:47
typeof NaN возвращает 'число', поэтому вы можете заменить это условие на !isNaN(new_arrayList[i]).
 – 
samuei
26 Янв 2022 в 17:52

3 ответа

Вы можете использовать метод array.filter() и сделать что-то вроде этого:

const unfilteredArray = [ NaN, 456, NaN, 382, NaN, 83, 2 ]
const numbersArray = unfilteredArray.filter(Number)
// Output : [ 456, 382, 83, 2 ]
1
Sandrow 26 Янв 2022 в 17:54
2
.filter(Number) может быть проблематичным, когда задействован 0: [83,2,0].filter(Number) -> [83,2]
 – 
Passerby
26 Янв 2022 в 18:01
const newArrayList = arrayList.split('_').filter(element => {
  return Number.parseInt(element);
}).map(element => {
  return Number.parseInt(element)
});
0
Alexandru Oriean 26 Янв 2022 в 18:02
input = 'abcd_456_yasdb_382_h_83_2';
array = [...input.matchAll(/\d+/g)].map(a => parseInt(a[0]));

console.log(array); // [456, 382, 83, 2]
0
sqram 26 Янв 2022 в 18:07