Преобразование массива чисел в строку и обратно в массив чисел в рамках одной функции с помощью JavaScript

#javascript #arrays #string #for-loop

#javascript #массивы #строка #for-цикл

Вопрос:

По сути, я пытаюсь превратить массив чисел в строку, а затем обратно в массив чисел (точно такой же, как исходный массив, который был передан) в рамках одной функции.

Я знаю, что это превратит массив чисел в строку:

 function arrayToStringAndBack (array) {
    return array.join(" ");
}

console.log(arrayToStringAndBack([1, 2, 3, 4]));
  

1 2 3 4

Но теперь, если я захочу превратить эту строку обратно в массив, это вернет массив с кавычками вокруг каждого числа (как массив строковых чисел):

 function arrayToStringAndBack (array) {

    let string = array.join(" ");

    return string.split(" ");

}
console.log(arrayToStringAndBack([1, 2, 3, 4]));
  

[ ‘1’, ‘2’, ‘3’, ‘4’ ]

Что я хочу сделать, так это превратить эту строку 1 2 3 4 в массив чисел [1, 2, 3, 4] .

Моя идея заключалась в том, чтобы перебирать каждый элемент в строке, превращая элемент в число с помощью .parseInt() , а затем помещая это число в новый массив:

 function arrayToStringAndBack (array) {

    let string = array.join(" ");

    let newArray = [];

    for (let i = 0; i <= string.length; i  ) {
        let number = parseInt(string[i]);
        newArray.push(number);
    }
    return newArray;
}

console.log(arrayToStringAndBack([1, 2, 3, 4]));
  

Но, как вы можете видеть, это регистрирует:

[ 1, NaN, 2, NaN, 3, NaN, 4, NaN]

Почему каждый другой элемент в numbers NaN ? Для меня это не имеет смысла.

Комментарии:

1. сопоставление с числом: string.split(" ").map(Number)

2. Подсказка: что произойдет, когда вы это сделаете parseInt(" ") ?

3. Я полагаю, вам не нужно беспокоиться о двузначных числах?

4. @James Я хотел бы учитывать двузначные числа, да. Как насчет того, что мой код в настоящее время не учитывает двузначные числа?

5. @HappyHands31 Проблема в том, что вы просматриваете строку по одному символу за раз.

Ответ №1:

При вашей второй попытке (с помощью parseInt) возникают две проблемы:

  • Вы выполняете на одну итерацию слишком много: <= в условии цикла должно быть < .
  • Вы также выполняете итерацию пробелов, которые находятся в объединенной строке.

Вам действительно следует объединить идею с split попыткой. Итак, повторяем результат применения split(" ") .

Но это можно сделать короче, применив Number к каждому элементу с map :

 return string.split(" ").map(Number)
  

Number Функция выполняет примерно то же самое, что и parseInt , за исключением того, что она не принимает более одного аргумента, что важно, когда вы передаете ее в качестве аргумента в .map() .

Ответ №2:

Используйте .map()

 let array = [ '1','2','3','4']
let arrayOfNumbers = array.map( item => parseInt(item))
  

Ответ №3:

Используйте map оба раза!

 let array = [1,2,3,222222222];
let arrayOfStrings = array.map(String);
let arrayOfNumbers = arrayOfStrings.map(Number);

console.log(array, arrayOfStrings, arrayOfNumbers);  

Ответ №4:

В последней части вы пытаетесь преобразовать каждую позицию строки в целые числа, включая пробелы. Таким образом, ‘1 2 3’ превращается в [1,NaN, 2,NaN,3], потому что пробелы не могут быть преобразованы в целые числа.

Эта модифицированная версия вашего кода должна работать: функция arrayToStringAndBack (массив) {

  let string = array.join(" ");
 let numbers = string.split(' ');
 let newArray = [];

    for (let i = 0; i < string.length; i  ) {
        let number = parseInt(numbers[i]);
        newArray.push(number);
    }
    return newArray;
}

console.log(arrayToStringAndBack([1, 2, 3, 4]));