我正在尝试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;
}
答案 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 );
});
}