【问题标题】:Determine if all objects in a object are empty or null判断一个对象中的所有对象是空还是null
【发布时间】:2018-09-15 21:54:02
【问题描述】:

我有一个基于文件数据填充的对象。我想知道被填充的对象是否有主要和次要的空对象,并且 gpa 中的属性都设置为空。以下是填充对象的样子:

Bob Smith {
  major: {},
  minor: {},
  gpa: { freshman: null, sophomore: null, junior:   null }
}

我想知道 bob smith 对象中的所有对象是否都是空的,这样我就可以退出程序而无需执行所有逻辑。

编辑 我没有像以前那样清楚。这不是一个全空或全是人口的情况。在某些情况下,有些对象会有数据,而有些则没有。 Bob Smith 有可能被填充为:

Bob Smith {
    major: { 
            department: 'Math'
           },
    minor: {},
    gpa: { freshman: 3.5, sophomore: null, junior: null }
}

简而言之,Bob Smith 对象可能有很多不同的非空对象组合,我只是在寻找一种方法来快速确定major 和minor 是否为空并且gpa 的值是否设置为null。我曾尝试使用 ._isEmpty(),但一直挂断 gpa 对象,因为它不是空的。

【问题讨论】:

  • 在您的示例中,gpa 属性不为空。这需要递归吗?您尝试过哪些不起作用的方法?
  • 你的目标不明确。如前所述,数据要么全部为空/空,要么全部填充。如前所述,您只需测试major 是否为空。请确认或澄清您的目标。
  • This:BobSmith.major.entries().length 将提供您的答案,如果对象全为空,则返回 false,否则返回非零答案(等效于 true)。

标签: javascript object


【解决方案1】:

您可以递归地遍历字段并查看它们是否都为空:

function allNull(obj) {
    for(var key in obj) {
        if (typeof obj[key] === 'object' && !allNull(obj[key])) {
            return false;
        } else if (typeof obj[key] !== 'undefined' && typeof obj[key] !== 'object' && obj[key] !== null) {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 如果第一个嵌套返回 false,则没有其他同级。将测试相同的级别。同样,它也会在不测试其他兄弟姐妹的情况下提前从 else 返回 false。
  • @RandyCasburn 你能澄清你的评论吗?我不知道你是在表扬还是在批评
  • 仅作为反馈。试试你的代码,它不会在整个结构中递归。在这两种情况下,它都会提前返回(在第一次发现 null/empty 之后)并在那时停止测试。它本质上不会递归超过第一个 null/empty。 (也许这是目标,但我们真的不知道。)我要求澄清。
  • @RandyCasburn 很抱歉造成混淆,这不是我的代码,但这只会返回false,因为这确实是目标,即任何非空/非空值都会导致false 结果.没有必要进一步检查,类似于Array.prototype.some
  • 如果这确实是目标,那么递归是不必要的。测试就像BobSmith.major.entries().length 一样简单。数据结构也是已知的。
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多