Ответ JSON обработки АФИ


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

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

Мой текущий код для этого (написано несколько месяцев назад) находится в гигантской анонимной функции:

user = query.users[0];
invalid = typeof user.invalid != "undefined";
missing = typeof user.missing != "undefined";
groups = (typeof user.groups == "object") ? user.groups : [];
editcount = (typeof user.editcount == "number") ? user.editcount : null;
registration = (typeof user.registration == "string") ?
    UserinfoJsParseDate(user.registration) : null;
blocked = typeof user.blockedby != "undefined";
gender = (typeof user.gender == "string") ? user.gender : null;
lastEdited = (typeof query.usercontribs[0] == "object") &&
    (typeof query.usercontribs[0].timestamp == "string") ?
    UserinfoJsParseDate(query.usercontribs[0].timestamp) : null;

Я пытаюсь прибраться, нарушая основные компоненты сценария на отдельные функции:

/**
 * Extract relevant information from the server's response.
 * @param data The server's response to the AJAX request
 * @return An object containing the user's information
 */
function processResponse( data ) {
    var query = data.query, info = {};

    if ( query && query.users && query.users[0] ) {
        var user = query.users[0];

        info.invalid = 'invalid' in user;
        info.missing = 'missing' in user;
        info.groups = user.groups || [];
        info.editcount = ( 'editcount' in user ) ? user.editcount : null;
        info.registration = ( 'registration' in user ) ? parseDate( user.registration ) : null;
        info.blocked = 'blockexpiry' in user;
        info.gender = ( 'gender' in user && user.gender != 'unknown' ) ? user.gender : null;

        info.lastEdited = null;
        if ( query.usercontribs && query.usercontribs[0] ) {
            var contribs = query.usercontribs[0];
            if ( contribs.timestamp ) {
                user.lastEdited = parseDate( contribs.timestamp );
            }
        }

    }

    return info;
}

Это лучше, или я просто написал более грязный код?



647
8
задан 22 февраля 2011 в 04:02 Источник Поделиться
Комментарии
1 ответ

Это, конечно, лучше. Вы можете улучшить его дальше:


  1. Использовать экзит-поллы для уменьшения кода стрелка.

  2. Использовать инициализатор JSON для результата.

  3. Префикс логические имена "есть".

  4. Исправление пользователя.lastEdited' ошибка.

.

function processResponse(data) {
if (!data.query || !data.query.users || !data.query.users[0]) return {};

var user = data.query.users[0];

return {
isInvalid: 'invalid' in user,
isMissing: 'missing' in user,
groups: user.groups || [],
editCount: ('editcount' in user) ? user.editcount : null,
registration: ('registration' in user) ? parseDate(user.registration) : null,
isBlocked: 'blockexpiry' in user,
gender: ('gender' in user && user.gender != 'unknown') ? user.gender : null,
lastEdited: (data.query.usercontrib
&& data.query.usercontribs[0]
&& data.query.usercontribs[0].timestamp)
? parseDate(data.query.usercontribs[0].timestamp) : null
};
}

5
ответ дан 28 февраля 2011 в 09:02 Источник Поделиться