【问题标题】:Any way in JavaScript to deep-check an object for a truthy value? [duplicate]JavaScript中有什么方法可以深入检查对象的真实值吗? [复制]
【发布时间】:2017-05-01 12:58:51
【问题描述】:

我相信 CoffeeScript 中有一种机制(? 令牌),但我想知道在 ES6 中是否有更好的方法来进行这种检查:

if (item && item.integrations && item.integrations.slackData) ...

(除了编​​写一个辅助函数,这是显而易见的解决方案)

编辑:这里的目标是使代码尽可能简单和简洁。

示例对象:

item = { integrations: { slackData: { url: '...' } } };

编辑 2:感谢您指出重复项。我不知道要搜索什么字词。我可能会使用 lodash 的 _.get() 函数。

【问题讨论】:

  • 有一些例子吗?如果有 7 个层次结构,我们需要检查最深的关键是否是“真实的”?
  • "如果有更好的方法在 ES6 中进行这种检查" 不,没有。有人讨论过这样的运营商,但没有任何结果。
  • @RomanPerekhrest 我的帖子包含了这个例子……是的。你是对的,它可以深入 7 层,想法是不要写出if (a && a.b && a.b.c && a.b.c.d && a.b.c.d.e)
  • data = { integrations: { slackData: { url } = {} } = {} } = item || {};.

标签: javascript


【解决方案1】:

你可以使用Array.prototype.every()

var check = [item, item.integrations, item.integrations.slackData]
            .every(function(element) { return element });

编辑、更新

正如@FelixKling 在 cmets 中所指出的,如果 item.integrations 未定义,则上面使用 .every() 的模式将失败。

鉴于 Question 中的示例对象,您可以使用 JSON.stringify()String.prototype.match()RegExp /"integrations":|"slackData":|"ur‌​l":/g/,然后检查结果数组的 .length(如果有)是否等于预期的属性数量;在本例中为3

传递给JSON.stringify()javascript 对象应具有以下模式的属性:

" 后跟 property 后跟 " 后跟 :。根据源对象,RegExp 可以进一步调整以满足该对象的特定属性和值。

JSON.stringify(item).match(/"integrations":|"slackData":|"ur‌​l":/g).length === 3

注意JSON.stringify() 有一个replacer 选项,可用于匹配对象的属性。 replacer 函数选项是递归的。另请参阅

但我想知道是否有更好的方法来进行这种检查 ES6:

目前的答案并未试图表明使用JSON.stringify()RegExp 匹配或过滤javascript 对象是“更好的”;但只有该方法可以满足当前问题的描述要求。

【讨论】:

  • 这是一个很酷的主意。虽然它肯定不比我发布的代码更冗长。我们的目标是让它更加简洁。
  • 如果item.integrations 不存在,这将不起作用。不幸的是,这根本没有意义。如果这样可行,那么可以写var check = Boolean(item.integrations.slackData);。不明白为什么这会得到支持:-/
  • 啊,也是。您必须创建一个类似checkProp(item, 'item.integrations.slackData') 的辅助函数,然后将字符串拆分,并仔细检查每个对象的真实值。
  • @ffxsam 你能在问题中包含示例对象吗?
  • @FelixKling 重点是,try/catch,你可以直接说item.integrations.slackData
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2016-04-29
  • 2019-09-06
  • 2011-10-19
  • 2011-08-04
相关资源
最近更新 更多