2012-07-14 304 views
29

我有一个函数,用于检查请求是否有任何查询,并基于此做出不同的操作。目前,我有if(query)做这个别的东西。但是,似乎没有查询数据时,我最终得到了一个{} JSON对象。因此,我需要用if(query.isEmpty())或其他类似的东西来代替if(query)。任何人都可以解释我如何能够在NodeJS中做这件事吗? V8 JSON对象是否具有此类功能?如何检查NodeJS中的JSON是否为空?

+0

不会'if(0 MilkyWayJoe 2012-07-14 03:39:05

+1

naaa,query.length ==未定义。长度在Array对象中是标准的,而不是JSON对象。 – thisissami 2012-07-14 04:10:50

回答

59

可以使用任一这些功能:

// This should work in node.js and other ES5 compliant implementations. 
function isEmptyObject(obj) { 
    return !Object.keys(obj).length; 
} 

// This should work both there and elsewhere. 
function isEmptyObject(obj) { 
    for (var key in obj) { 
    if (Object.prototype.hasOwnProperty.call(obj, key)) { 
     return false; 
    } 
    } 
    return true; 
} 

实例:

if (isEmptyObject(query)) { 
    // There are no queries. 
} else { 
    // There is at least one query, 
    // or at least the query object is not empty. 
} 
+0

不错...第二个在节点中运行良好...虽然没有尝试第一个,但 – Nav 2013-05-27 09:46:46

16

可以使用此:

var isEmpty = function(obj) { 
    return Object.keys(obj).length === 0; 
} 

或该:

function isEmpty(obj) { 
    return !Object.keys(obj).length > 0; 
} 

您也可以使用此:

function isEmpty(obj) { 
    for(var prop in obj) { 
    if(obj.hasOwnProperty(prop)) 
     return false; 
    } 

    return true; 
} 

如果使用underscorejQuery,你可以用自己的isEmptyisEmptyObject电话。

3

在游戏后期,但我使用了另一种我更喜欢的方式,即使它不是“正确的”解决方案。

JSON.stringify(obj) === '{}' 

我知道这种做法可能会得到不好的评论,因为我假设空对象的该字符串表示是{}(什么,如果它是{ }) - 但我觉得它更容易这样,没有一个功能,它似乎为我工作得很好。

+1

有许多原因,这不是一个很好的解决方案,包括性能,以及对象可以被串化的各种方式例如,使用属性对错误进行字符串化。 – 2014-07-31 12:32:55

+0

@DaveNewton,,我同意这不是一个很好的解决方案。我在我的回答中表明了这一点。我不同意Error的例子,因为Object.keys(obj).length === 0'也会返回空,所以在这种情况下,这个解决方案仍然是正确的。 – 2014-08-01 07:16:54