#javascript #arrays #algorithm
Вопрос:
Здравствуйте, я пытаюсь сделать код войны ката: https://www.codewars.com/kata/54a91a4883a7de5d7800009c/train/javascript
Я знаю, что то, что я сделал, очень многословно, но я хотел сделать это шаг за шагом, прежде чем переделывать это.
- Я разделил ввод строки от пользователя
- Отфильтрован по массиву только для того, чтобы получить число и преобразовать его в ЧИСЛО
- Увеличил это число на 1
- Изменено число обратно на строку
- Теперь я хочу добавить свой строковый номер в исходный массив, но это не работает, и я не понимаю, почему :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()
метод, вы получаете в качестве возврата длину обновленного массива, которая в данном случае равна 112. @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. Я посмотрю на это и попытаюсь разобраться в этом. Спасибо за решение 🙂