【问题标题】:Can't validate Object in Object无法验证对象中的对象
【发布时间】:2018-07-14 02:17:37
【问题描述】:

对象的值通过以下方式获取:

const link = $("#link").val();
const state = $("#state").val(); etc...

然后返回对象:

const departmentObject = {
  position,
  name,
  link,
  state,
  requirements: {
    age,
    citizenship,
    degree
  },
  salary,
  description
};

我将对象传递给我正在验证其内容的后续函数。由于主对象内的对象requirements,我无法验证这一点。我从一个 IF 语句开始:

let missingBoxes = [];
const array = Object.keys(departmentObject);
const subArray = Object.keys(departmentObject.requirements);

for (let i = 0; i < array.length; i++) {
  keyname = array[i];
  if (departmentObject[keyname] !== "") {
    console.log("box not empty");
  } else {
    console.log("box empty, push to missingBoxes");
    missingBoxes.push(keyname);
  }
}

然后我创建了一个子数组来独立测试departmentObject.requirements,但显然requirements 仍在原来的departmentObject 中。我需要一个 if 语句或两个单独的语句。

【问题讨论】:

    标签: javascript jquery arrays object


    【解决方案1】:

    对于嵌套对象的验证,您可以在 for 循环中使用递归。

    function check(obj){
        var keys = Object.keys(obj);
        var missingBoxes = [];
        for(let i=0; i<keys.length; i++){
            if(obj[keys[i]]!== ''){
                if(obj[keys[i]].constructor === {}.constructor){
                    check(obj[keys[i]]);
                 }
            }else{
                missingBoxes.push(keys[i]);
               console.log('blank')
             }
        }
        console.log(missingBoxes);
    
        }
    

    步骤:

    1. 从 Object 中获取键
    2. 检查键的值是否不是银行
    3. 如果是,则将其添加到 missingBoxes 数组中。
    4. 如果不是,则检查这是否是一个对象。
    5. 如果对象再次调用检查方法。

    【讨论】:

    • 检查未定义
    • 第一行功能检查正在定义它。所以这应该不是问题。你是在函数体上复制吗?在这种情况下,您将收到该错误。
    • 天哪,这行得通!稍微调整一下,但我将所有盒子放在一个干净的数组中。肯定会阅读递归函数。谢谢@manoj-yadav
    • 一个问题,我以前没见过.constructor === {}.constructor。它有什么作用?
    • 检查值的类型。你可以在这里找到更多关于这个stackoverflow.com/questions/7688070/…和这个了解更多信息。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案2】:

    您可以使用递归来处理嵌套的需求对象。

    function findMissingKeys(obj, keyPath = null, missingKeys = []) {  
      for(let key in obj) {
        if (typeof obj[key] === 'object') {
          findMissingKeys(obj[key], key, missingKeys)
        } else if (obj[key] === "") {
          if (keyPath) {
            missingKeys.push(`${keyPath}.${key}`);
          } else {
            missingKeys.push(key);
          }
        }
      }
      return missingKeys
    }
    
    function validateDepartment() {
      try {
        const textArea = document.getElementById("textArea")
        const departmentObject = JSON.parse(textArea.value)
        const missingKeys = findMissingKeys(departmentObject)
        console.log({ missingKeys })
      } catch(e) {
        alert(e)
      }
    }
    
    validateDepartment()
    <h4>Department Validator</h4>
    <textarea id="textArea" cols=50 rows=10>
      {
        "position": "",
        "name": "",
        "link": "",
        "state": "",
        "requirements": {
          "age": "",
          "citizenship": "",
          "degree": ""
        },
        "salary": "",
        "description": ""
      }
    </textarea>
    <hr>
    <button onclick="validateDepartment()">
      Validate
    </button>

    【讨论】:

    • 解释对我有很大帮助
    猜你喜欢
    • 2022-01-17
    • 2018-12-12
    • 1970-01-01
    • 2014-10-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多