【问题标题】:Check all properties are not null in n-depth POJO检查 n 深度 POJO 中的所有属性不为空
【发布时间】:2020-05-26 20:39:50
【问题描述】:

我需要一个函数,它可以接受任何对象并在每个孩子都满足条件时返回真/假。目前,该条件是该属性是真实的。所以 null 和 undefined 应该返回 false,但是 false 的值是通过。

我正在从事的项目是 Typescript,但这也适用于 vanilla JS,我也可以使用 lodash。

到目前为止,我已经开始使用此功能:

function CheckAllPropertiesDefined(obj){
  if (!obj) {
    return false;
  }

  for (const key in obj) {
    if (o[key] === null || o[key] === undefined) {
      return false;
    }
  }

  return true;
}

但是我所做的事情的要求发生了变化(不再是平面对象),我意识到它不适用于嵌套属性。

对这个对象运行它的结果是真的,而它不应该是:

const obj = {
  prop1: true,
  prop2: true,
  prop3: {
    prop3a: false,
  },
  prop4: {
    test: null,
    foo: false,
    child: {
      child2: null,
    },
  },
};

它应该返回 false,因为 prop4.testprop4.child.child2 为空。我认为一些递归是必要的。

【问题讨论】:

    标签: javascript typescript recursion pojo


    【解决方案1】:

    我通常更喜欢将对象的遍历与我们对其执行的操作分开。在这里,我将编写一个通用函数,它可以对任何(标量)节点应用谓词,并递归对象或数组。然后我们可以简单地用一个函数调用它来测试节点不是nullundefined 来取回一个用于测试对象的函数。这是一个例子:

    const checkAllDeep = (pred) => (xs) =>
      Array .isArray (xs)
        ? xs .every (x => checkAllDeep (pred) (x))
      : xs && typeof xs == 'object'
        ? Object .entries (xs) .every (([k, v]) => checkAllDeep (pred) (v))
      : pred (xs)
    
    const checkAllPropertiesDefined = checkAllDeep (x => x !== null && x !== undefined)
    
    const obj = {prop1: true, prop2: true, prop3: {prop3a: false}, prop4: {test: null, foo: false, child: {child2: null}}}
    
    console .log (checkAllPropertiesDefined (obj))

    稍后如果我们想更改谓词(例如,我们想接受null 但不接受undefined),很容易找到。我们可以很简单地编写其他函数,例如const allPropsAreStrings (checkAllDeep ((x) => typeof x == 'string')

    【讨论】:

    • 这是有道理的。我的特定用例不需要这样的东西,也许它比我需要的要复杂一点,而不是仅仅调用一个函数并传递一个对象。
    • @NattyMan0007:我认为它比许多替代方案更简单。最后,我们通过传递一个对象来创建一个我们使用的函数:checkAllPropertiesDefined (obj)。但我们是在一个可重用的函数之上完成的。
    【解决方案2】:

    所以在这篇文章 30 秒后,我拿出了一个绘图工具 (iPad),并写下了解决这个问题的逻辑步骤并找到了解决方案。我强烈建议在卡住时这样做,而不是跑到互联网上。

    我无法在 SO 上找到针对此特定问题的合适解决方案,所有解决方案都仅适用于非嵌套 POJO。

    如果有人可以改进它,我愿意接受。

    这是我在 Javscript 中的解决方案:

    function CheckAllPropertiesDefined(obj) {
      if (!obj) {
        return false;
      }
    
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === "object") {
            if (!CheckAllPropertiesDefined(obj[key])) {
              return false;
            }
          }
          if (obj[key] === null || obj[key] === undefined) {
            return false;
          }
        }
      }
      return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2012-09-27
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多