未定义的计数作为变量 - 与我的isObjEmpty()函数混淆

时间:2014-04-08 00:59:46

标签: javascript jquery performance

我正在尝试post一个对象,只有它不是空的。但是我有代码导致属性变得未定义 - 当发生这种情况时,obj不再是空的,post仍然会发生。

userSearchData = {};

$('#addContactForm').keyup(function()
{

    var email = $(this).find('input[name="email"]').val();
    var username = $(this).find('input[name="username"]').val();
    var fullName = $(this).find('input[name="fullName"]').val();

    userSearchData.email = email.length >= 3 ? email : undefined;
    userSearchData.username = username.length >= 3 ? username : undefined;
    userSearchData.fullName = fullName.length >= 3 ? fullName : undefined;

    console.log(userSearchData);

    if ( !isEmpty(userSearchData) )
    {
        console.log("Is empty")
        $.post( '/post/addContact', { userSearchData: userSearchData }, function( data ) 
        {
            console.log( data );
        });
    }

});

这是一个“搜索”表单,所以如果用户输入例如“Blabla”作为用户名,然后删除字母使其成为“Bl”,则用户名变量将被取消定义,因此在执行此操作时不会发送post(我在服务器端登录对象并且未考虑未定义的变量哪个好)。

  • 当长度低于3时,如何完全删除变量,而不是未定义?

  • 如果所有键都未定义,我可能会修改isEmpty函数返回false,那会更好吗?如果是这样,你会怎么做?

    var hasOwnProperty = Object.prototype.hasOwnProperty;
    
    function isEmpty (obj)
    {
        // null and undefined are "empty"
        if (obj == null) return true;
    
        // Assume if it has a length property with a non-zero value
        // that that property is correct.
        if (obj.length > 0)    return false;
        if (obj.length === 0)  return true;
    
        // Otherwise, does it have any properties of its own?
        // Note that this doesn't handle
        // toString and valueOf enumeration bugs in IE < 9
        for (var key in obj) {
            if (hasOwnProperty.call(obj, key)) return false;
        }
    
        return true;
    }
    

4 个答案:

答案 0 :(得分:1)

整件事似乎毫无意义,你可以这样做而不是

$('#addContactForm').on('keyup', function() {
    var userSearchData = {}, self = this;

    $.each(['email', 'username', 'fullName'], function(_, el)  {
        var val = $(self).find('input[name="'+el+'"]').val();
        if ( val.length > 3 ) userSearchData[el] = val;
    });

    $.post( '/post/addContact', { userSearchData: userSearchData }, function( data ) {
        console.log( data );
    });
});

答案 1 :(得分:1)

如果满足条件,则仅将属性添加到对象。

if ( username.length >=3 ) {
    userSearchData.username = username;
}

if ( username in userSearchData ) {
    // do stuff
}

答案 2 :(得分:0)

您可以在JS中使用delete属性,但更好的解决方法是确保您的代码在应用时发布。

if (obj === null || obj === undefined) return;

或者其他什么东西可以帮助你。

此外,for(key in obj)是老式的&#34;迭代原型&#34;,并且非常气馁,所以你可能想要这样:

var keys = Object.keys(obj);
if(keys.length === 0) ...
keys.forEach(function(key) { ... });

答案 3 :(得分:0)

你的意思是你想要这样做吗?

if(!isEmpty(userSearchData)){
     $.post( '/post/addContact', { userSearchData: userSearchData }, function( data ) 
    {
        console.log( data );
    });
}