使用lodash检查空对象将返回false

时间:2016-10-31 17:14:12

标签: javascript node.js lodash javascript-objects

我有一个对象req.user.stripe,其值为空对象def get_symbols(lot): symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' newlot = [] for i in lot: if i == symbols: newlot.append(symbols) return newlot else: return None 。 我想使用lodash函数{}来检查此对象是否为空。当我运行isEmpty()时,我得到console.log(_.isEmpty(req.user.stripe))的返回值。 false实际上返回一个空对象console.log(req.user.stripe)

不确定我错过了什么。我愿意使用除了lodash之外的其他方法。本质上,我需要访问req.user.stripe中的属性,但仅当req.user.stripe不是空对象时(否则我会收到一条错误,指出JS无法读取{{1}上的属性{} }})。

澄清 在我的mongoose模式中,创建用户时,它们是使用x参数创建的,但默认为空对象undefined。只有当我们真正与条纹交谈时才会填满数据。我的系统中有许多beta用户被提供帐户,但没有通过与在前端注册的人相同的过程。这些用户现在需要付费,但他们必须保留他们的帐户。我需要检测用户是否有条带信息,因此我要检查req.user对象中的条带参数是否为空对象。

例如,如果我想访问用户保存卡的最后4位数字,我可以通过stripe方式访问它。但是,在尝试访问没有条带数据的用户时,会出现类似于{}的错误。当req.user.stripe.customer.sources.data[0].last4对象为空时,我需要能够处理这样的条件。

3 个答案:

答案 0 :(得分:0)

在访问该属性之前,请使用if语句:

if(req.user && req.user.stripe) { do_your_thing() }

答案 1 :(得分:0)

这里有三个选项:

  1. 您的对象实际上并不是空的,出于某种原因,它在控制台上显示为空。

  2. 当你执行console.log时它实际上是空的,但是当你执行_.isEmpty时却没有(正如@Todd Chaffee在评论中所建议的那样;但我觉得这很可疑)

  3. _.isEmpty中存在错误。 (我也觉得这个可疑,但这是可能的)

  4. 但是,正如其他人在评论中所说,我认为_.isEmpty首先不是你想要的。

    req.user.stripe.customer.sources.data[0].last4为例:如果req.user.stripe不为空,但未定义customer,或者它是空的,或已定义sources.data,该怎么办?数组是未定义的还是空的,或者等等?当然,也许所有这些情况在当前的代码中是完全不可能的,但它们总是会吗? _.isEmpty(req.user.stripe)是一个相当脆弱的测试。

    更安全的替代方法是_.get(req, "user.stripe.customer.sources.data[0].last4"),如果任何这些中间属性为空,它将返回null

    ...但坦率地说,它有一个更大的结构问题,你试图获得信用卡的最后4位数而不知道你是否首先得到了一个客户。

答案 2 :(得分:0)

这是一个老问题,但是使用_.isNil(object)为我解决了这个问题,如果object为null或为空,则返回。