Напишите функцию, которая принимает закодированную строку и возвращает объект в соответствии со следующим примером:

Рейтинг: 0Ответов: 2Опубликовано: 15.04.2023

Задание 2 Напишите функцию, которая принимает закодированную строку и возвращает объект в соответствии со следующим примером:

parseCode("John000Doe000123") ➞ {  firstName: "John",  lastName: "Doe",  id: "123"}
parseCode("michael0smith004331") ➞ {  firstName: "michael",  lastName: "smith",  id: "4331"}
parseCode("Thomas00LEE0000043") ➞ {  firstName: "Thomas",  lastName: "LEE",  id: "43"}

function parseCode(str) {
    let firstName = "";
    let lastName = "";
    let id = "";
    let zero = 0;
    for (let i = 0; i < str.length; i++) {
        if (str[i] === "0" && zero === 0) {
            firstName = str.slice(0, i);
            str = str.slice(i + 3);
            i = -1;
            zero++;
        } else if (str[i] === "0" && zero === 1) {
            lastName = str.slice(0, i);
            str = str.slice(i + 3);
            i = -1;
            zero++;
        } else if (str[i] === "0" && zero === 2) {
            id = str.slice(0, i);
            break;
        }
    }
    return {
        firstName: firstName,
        lastName: lastName,
        id: id
    };
}

console.log(parseCode("John000Doe000123"))
console.log(parseCode("michael0smith004331"))
console.log(parseCode("Thomas00LEE0000043"))

Ответы

▲ 2

Сначала я разберу Ваш код, почему он не работал, мне важно было понять как Вы думали, поэтому я и свое решение написал на основе Вашего кода, но значительно переработал его, до не узнаваемости, мое решение будет попозже.

В первом условии вы добавляете 3 тут str = str.slice(i + 3); но это не совсем верно так как количество нулей после имени в каждом случае разное поэтому у вас обрезало фамилиию:

John    + 000 = Doe000123" 
michael + 0sm = ith004331"
Thomas  + 00L = EE0000043"

В последнем условии у Вас не учитывается что в конце строки не будет нулей, а будет конец строки поэтому я добавил условие i === str.length -1, что касается str то решение интересное, но не для такого случая, поэтому, я решил использовать другую переменную end_zero обозначающую позицию последнего нуля в цепочке нулей +1 — т.е. получается это будет первой буквой слова, я взял их в квадратные скобки для наглядности тут:

John 000[D]oe000[1]23
michael0[s]mith00[4]331
Thomas00[L]EE00000[4]3 

Таким образом слово я обрезаю от end_zero до i, а в последнем случае с id до конца и перевожу в число через +.

И мне нужно добавить 4 условие, чтобы максимально сохранить Вашу логику и заставить код работать.

function parseCode(str) {
    let firstName = "";
    let lastName = "";
    let id = "";
    let zero = 0;
    let end_zero = 0
    for (let i = 0; i < str.length; i++) {
        if (str[i] === "0" && zero === 0) {
            firstName = str.slice(0, i);
            // str = str.slice(i + 3);
            //i = -1;
            zero++;
        //} else if (str[i] === "0" && zero === 1) {            
        } else if (str[i] === "0" && str[i-1] !="0" && zero === 1) {
            //lastName = str.slice(0, i);
            lastName = str.slice(end_zero, i);
            //str = str.slice(i + 3);
            //i = -1;
            zero++;
        //} else if (str[i] === "0" && zero === 2) {
        } else if (i === str.length - 1 && zero === 2) {  
            //id = str.slice(0, i);
            id = +str.slice(end_zero);
            //break;
        } 
        /* + */
        else if ( str[i] === "0" && str[i + 1] !== "0" && zero > 0){
            end_zero = i + 1
        } 
    }
    return {
        firstName,
        lastName,
        id
    };
}

console.log(parseCode("John000Doe000123"))
console.log(parseCode("michael0smith004331"))
console.log(parseCode("Thomas00LEE0000043"))

В синтаксисе JS c ES6 можно писать так (это создаст объект из где ключами будут имена переменных, а значениями их же значения — удобно):

{
    firstName,
    lastName,
    id
};

Теперь я добавлю свои вариант, в нем сложно допустить ошибку так как он достаточно легко читается единственный сложный момент это понять что тут:

result[Object.keys(result)[idx]]

Это обращение к свойству по индексу Object.keys(result) мне вернет три свойства в строгом порядке так как объект не модифицировался с момента создания. Таким образом я могу обратится к свойству через idx

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

function parseCode(str) {
    const result = {
        firstName: '',
        lastName: '',
        id: ''
    };
    let idx = 0
    let is_zero = false
    for (let i = 0; i < str.length; i++) {
        if (str[i] != "0"){
            is_zero = false
            result[Object.keys(result)[idx]] += str[i]
        } else if (is_zero === false){
            is_zero = true
            idx++
        } 
    }
    return result
}
console.log(parseCode("John000Doe000123"))
console.log(parseCode("michael0smith004331"))
console.log(parseCode("Thomas00LEE0000043"))

И я решил добавить еще решение с регуляркой, вдруг Вам понравится с ними работать)

function parseCode(str) {
    const [firstName, lastName, id] = str.split(/0+/)
    return {firstName, lastName, id}
}

console.log(parseCode("John000Doe000123"))
console.log(parseCode("michael0smith004331"))
console.log(parseCode("Thomas00LEE0000043"))

Хотя вопрос не про регулярки, но добавлю еще один вариант который будет искать id с нулями:

function parseCode(str) {
    const [firstName, lastName, id] = str.match(/^([A-z]+)|([A-z]+)|([1-9][0-9]+)$/g)
    return {firstName, lastName, id}
}

console.log(parseCode("John000Doe000100203"))
console.log(parseCode("michael0smith0043031"))
console.log(parseCode("Thomas00LEE00000403"))

▲ 1

Вроде работает :)

function parseCode(str) {
    const [firstName, lastName, id] = str.split(/0\s*/).filter(e => e !== "")
    return {firstName, lastName, id}
}

console.log(parseCode("John000Doe000123"))
console.log(parseCode("michael0smith004331"))
console.log(parseCode("Thomas00LEE0000043"))
console.log(parseCode("John0Doe0100500"))

ps.. решение не работает если пользователь ввел 0 либо в ID есть 0