Извлекая первый, последний & отчество от полного имени


Моя функция принимает строку и возвращает Имя Фамилия, Имя и отчество в качестве выходного.

Просьба проверить и помочь мне оптимизировать его.

    //input --> Hamza Khan
    ProcessFullName(full_name): Object {
        var Obj = {
            FirstName: "",
            LastName: "",
            MiddleName: ""
        };
        var splitName = full_name.split(" ");
        if (splitName.length>0) {
            switch (splitName.length) {
                case 1:
                    Obj.FirstName = splitName[0];
                    break;
                case 2: 
                    Obj.FirstName = splitName[0];
                    Obj.LastName = splitName[1];
                    break;
                case 3: 
                    Obj.FirstName = splitName[0];
                    Obj.MiddleName = splitName[1];
                    Obj.LastName = splitName[2]; 
                    break;
            }
        }
        return Obj;
    } //Output --> { FirstName: "Hamza", LastName: "Khan", MiddleName: "" }


814
2
задан 12 марта 2018 в 07:03 Источник Поделиться
Комментарии
1 ответ


  • Обеспечить тип full_name аргумент и более конкретный тип, чем Object для возвращаемого типа:

    interface SplitNameData {  // Does anybody have a better interface name?
    FirstName: string;
    MiddleName: string;
    LastName: string;
    }

    ProcessFullName(full_name: string): SplitNameData {
    const Obj: SplitNameData = {
    firstName: '',
    middleName: '',
    lastName: ''
    };


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

  • Какова ваша функция должна делать с именами, имеющие более трех частей?

  • Рассмотрите возможность использования const везде, где это возможно и let во всех остальных случаях. Я рекомендую никогда не использовать var. ⇒ const Obj, const splitName.

  • Использовать более описательное имя Objнапример, splitNameData или separatedNames. В данном случае, я бы порекомендовал переименовать splitName что-то вроде nameParts также, чтобы избежать путаницы.

  • Использовать последовательную схему именования: fullName вместо full_name, firstName вместо FirstName и так далее.

  • Использовать массив деструктурируется:

    case 2:
    [Obj.FirstName, Obj.LastName] = splitName;
    break;
    case 3:
    [Obj.FirstName, Obj.MiddleName, Obj.LastName] = splitName;
    break;

  • эффективность рекламы: для этого вычислительно простая задача, любая оптимизация будет преждевременная оптимизация на мой взгляд.

  • Альтернатива (может быть чище?) решение с использованием имени обработать захват группы:

    const NAME_PATTERN = /^(?<firstName>[^ ]*) ((?<middleName>[^ ]*) )?(?<lastName>[^ ]*)$/;

    const emptyNameData = {
    firstName: '', middleName: '', lastName: ''
    };

    const {
    groups: {
    firstName,
    middleName = '',
    lastName
    } = emptyNameData
    } = NAME_PATTERN.exec(fullName) || {};
    alert([firstName, middleName, lastName]);

    Я не очень увлечен || {} часть, может, если-нибудь проверка объекта на матч null будет лучшим решением.


2
ответ дан 12 марта 2018 в 08:03 Источник Поделиться