Processing an API's JSON response
It is certainly better. You can improve it further:


Use early exits to reduce arrow code.
Use a JSON initializer for the result.
Prefix boolean names with 'is'.
Fix the 'user.lastEdited' bug.


.

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 &amp;&amp; user.gender != 'unknown') ? user.gender : null,
        lastEdited: (data.query.usercontrib
                             &amp;&amp; data.query.usercontribs[0] 
                             &amp;&amp; data.query.usercontribs[0].timestamp)
                        ? parseDate(data.query.usercontribs[0].timestamp) : null
    };
}