Почему я не могу вставить число в свой массив строк, даже если я преобразовал число обратно в строку?

#javascript #arrays #algorithm

Вопрос:

Здравствуйте, я пытаюсь сделать код войны ката: https://www.codewars.com/kata/54a91a4883a7de5d7800009c/train/javascript

Я знаю, что то, что я сделал, очень многословно, но я хотел сделать это шаг за шагом, прежде чем переделывать это.

  1. Я разделил ввод строки от пользователя
  2. Отфильтрован по массиву только для того, чтобы получить число и преобразовать его в ЧИСЛО
  3. Увеличил это число на 1
  4. Изменено число обратно на строку
  5. Теперь я хочу добавить свой строковый номер в исходный массив, но это не работает, и я не понимаю, почему :S

Я знаю, что это не окончательный ответ на ката, но я просто пытаюсь что-то сделать и удивляюсь, почему это не сработало…

 function isNumeric(num){
 return !isNaN(num)
}

function incrementString (string) {
  const splitString = string.split("");

  let numbers = Number(splitString.filter(el => isNumeric(el)).join("")); //[
  'f', 'o', 'o', 'b',
  'a', 'r', '0', '0',
  '4', '2'
]

  let incrementNumber = numbers  =1; // 43

  let revertNumberToString = incrementNumber.toString(); // "43"

  let test = splitString.push(revertNumberToString); // why can I not push the number 43 onto my original array?

  console.log(test); // 11? why?

}

incrementString("foobar0042")
 

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

1. Это работает — попробуйте это console.log(splitString); . Когда вы возвращаете .push() метод, вы получаете в качестве возврата длину обновленного массива, которая в данном случае равна 11

2. @Lain .filter(Number) удалит нули, которые являются числами , но также являются ложными.

Ответ №1:

Похоже, это действительно работает правильно. Если вы снова проверите splitString после нажатия на него, то в нем будут все 11 элементов. Вот откуда берется число 11. Когда вы сохраняете push в переменную, он не создает новый массив, а, скорее, сохраняет длину нового массива.

   console.log(splitString)
  // ["f", "o", "o", "b", "a", "r", "0", "0", "4", "2"]
  let test = splitString.push(revertNumberToString);
  console.log(splitString)
  // ["f", "o", "o", "b", "a", "r", "0", "0", "4", "2", 43]
  console.log(test); // 11? why?

 

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

1. Это должно быть комментарием. Работайте над публикацией качественных ответов (это, скорее всего, будет отклонено), чтобы получить достаточную репутацию, чтобы иметь возможность комментировать.

2. Да, я пока не могу комментировать, я хочу поднять свою репутацию, чтобы я мог просто опубликовать ее в качестве комментария, а не ответа

3. Да, но публикация «ответов», подобных этому, не поможет вам поднять свою репутацию. Из-за вероятного снижения голосов это снизит вашу репутацию.

4. О, хорошо, я вижу, что метод push добавляет элемент, но затем сохраняет количество элементов в массиве, а не в массиве… вау, приятно это знать

Ответ №2:

Метод Javascript push добавляет элемент в массив и возвращает длину, поэтому вы получаете 11 вместо самого массива. Ссылка

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

1. ооо, я вижу, спасибо за объяснение и ссылку, теперь я могу продолжить ката

Ответ №3:

Вы могли бы использовать другой подход, разделив значение на строковую и числовую части и взяв длину числовой части для последующего заполнения значения начальными нулями.

 function incrementString(value) {
    const
        string = (value.match(/D /) || [''])[0],
        number = (value.match(/d /) || ['0'])[0];

    return string   ( number   1).toString().padStart(number.length, 0);
}

function assertEquals(a, b) {
    console.log(a === b, a, b);
}

assertEquals(incrementString("foobar000"), "foobar001");
assertEquals(incrementString("foo"), "foo1");
assertEquals(incrementString("foobar001"), "foobar002");
assertEquals(incrementString("foobar99"), "foobar100");
assertEquals(incrementString("foobar099"), "foobar100");
assertEquals(incrementString(""), "1"); 

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

1. Это выглядит хорошо @Nina, но я все еще нахожусь в начале своего путешествия по JS. Я посмотрю на это и попытаюсь разобраться в этом. Спасибо за решение 🙂