首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查空对象

检查空对象
EN

Code Review用户
提问于 2021-02-03 07:06:50
回答 1查看 80关注 0票数 1

我有一个添加新联系人的模式,为了禁用保存按钮(如果没有输入数据),我检查联系人对象是否为空,是否有更短的方法检查空复杂对象?

代码语言:javascript
代码运行次数:0
运行
复制
  let isContactEmpty = true

  Object.keys(contact).forEach(field => {
    if (typeof contact[field] === 'string' && contact[field]) {
      isContactEmpty = false
      return
    }
    if (typeof contact[field] === 'object') {
      contact[field].forEach(fieldVal => {
        if (fieldVal.value.length) {
          isContactEmpty = false
        }
      })
    }
  })
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-02-04 03:38:44

  • 您使用.forEach()而不是for-of有什么特别的原因吗?因为.forEach()使用一个函数进行迭代,所以一旦您知道联系人不是空的,就没有办法提前停止。如果您使用的是for-of,那么一旦您知道结果是假的,就可以只使用return false
  • 看起来您正在执行一个typeof value === 'object'来检查某个东西是否是一个数组。相反,您可以执行Array.isArray(value)
  • 您正在遍历对象的键,但您只使用该键获取字段的值。为什么不直接用Object.values()循环这些值呢?

应用了这些建议后,您的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
function isContactEmpty(contact) {
  for (const field of Object.values(contact)) {
    if (typeof field === 'string' && field) {
      return false
    } else if (Array.isArray(field)) {
      for (const { value } of field) {
        if (value.length) return false
      }
    }
  }
  return true
}

但是,我们可以更进一步。Javascript有一个更高级别的函数来完成我们使用这些循环所做的事情,但是没有样板- array.every()。它接受一个回调,该回调返回一个布尔值,并与数组的每个元素一起调用。如果所有回调返回true,则every()的返回值为true,如果其中一个回调返回false,则返回false。(当一个回调返回false时,它也将停止迭代)。

代码语言:javascript
代码运行次数:0
运行
复制
const isContactEmpty = contact => (
  Object.values(contact).every(field => {
    if (typeof field === 'string') return !field
    if (Array.isArray(field)) return areArrayEntriesEmpty(field)
    return true
  })
)

const areArrayEntriesEmpty = field => (
  field.every(({ value }) => value.length === 0)
)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/255547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档