簡體   English   中英

Javascript - 遞歸查找數組中具有空值的鍵

[英]Javascript - Recursively looking for keys in array with empty values

我創建了一個 function 以遞歸方式在嵌套數組中查找空值。

function 起初返回正確的值,但似乎在返回結果之前將其重置為輸入值。

我錯過了什么?

這是我的代碼:

const obj = [
  {
    mainContact: true,
    contactName: "",
    emailId: "abc@gmail.com",
    contactAddress: [
      {
        addressType: "",
        county: "U.K.",
        postCode: "MK7 6BZ",
        houseFlatNumber: 1
      },
      {
        addressType: "def",
        county: "France",
        postCode: "123MKO",
        houseFlatNumber: "223"
      }
    ],
    phoneDetails: [
      {
        notes: "",
        phoneNumber: "1234567899",
        countryCode: "44",
        priority: "1"
      },
      {
        notes: "Lorem ipsum",
        phoneNumber: "1112223331",
        countryCode: "48",
        priority: "2"
      }
    ]
  }
];

function validObject(obj, isOk) {
  for (var propName in obj) {
    if (typeof obj[propName] === "object") {
      this.validObject(obj[propName], isOk);
    } else if (
      obj[propName] === null ||
      obj[propName] === undefined ||
      obj[propName] === ""
    ) {
      isOk = false;
      break;
    }
  }
  return isOk;
}

console.log(validObject(obj), true);
// This should return false but it returns true although it first hit the return isOk line
// with a false value then set it back to true

任何幫助將非常感激。

謝謝。

基本問題是您沒有返回遞歸調用的值。 所以你實際上在做的是執行一個內聯遞歸循環,然后從父調用返回值。

此外,因為isOk是原始 boolean,所以它是按值傳遞而不是按引用傳遞。 因此在子 function 調用中修改isOk不會修改父 scope 中的變量。

注意:這不適用於obj[propName] (通過引用傳遞),因此對 function 內部數據的任何修改都將保留在 function 之外。

function validObject(obj) {
  for (var propName in obj) {
    if( typeof obj[propName] === "object" ) {
      if( validObject(obj[propName]) === false ) {
        // This will propergate back through the call stack
        return false;
     }
   } 
   else if (
     obj[propName] === null      || 
     obj[propName] === undefined || 
     obj[propName] === ''
   ) {
     return false;  // we don't need a variable here
   }
 }
 return true;  // calculatus eliminatus, nothing is false, so it must be true
}

關於遞歸的事情是你必須從你的遞歸調用中返回值。 這意味着您從內部調用 function,然后相應地處理返回值。

這是我對您的 function 的解釋,我在其中添加了一個簡單的基本情況來檢查傳遞的值是nullundefined還是空字符串。

function isValidObject(obj) {
  // Base case
  if (obj[propName] === null || obj[propName] === undefined || obj[propName] === '') {
    return false;
  }

  // Recurse through each item in object
  if (typeof obj === "object") {
    for (var propName in obj) {
      if (!isValidObject(obj[propName]) {
        return false;
      }
    }
  }
  return true;
}

請注意,這允許您擺脫傳遞給 function 的 boolean 參數,而在找到第一個參數時只返回 false

感謝 James McGuigan,我編輯的版本如下:

       isValidObject(obj) {

         for (var propName in obj) {
            if( typeof obj[propName] === "object" ) {
                if( this.isValidObject(obj[propName]) === false || 
                     obj[propName] === null || 
                     obj[propName].length === 0 ) 
                {
                     return false;
                }
            } 
            else if (
                      obj[propName] === null      || 
                      obj[propName] === undefined || 
                      obj[propName] === '' 
                    ) {
                         return false;  
                      }
            }
            return true;  

        }

另一種方法是編寫一個更通用的 function 以遞歸地測試 object 屬性的有效性,給定一個要測試的謂詞。

這並不難; 在我看來,這通常比直接編寫特定的 function 更簡單。 並將其應用於特定案例也很簡單。

它可能看起來像這樣:

 const isValid = (pred) => (obj) => Object.values (obj).every ( v => (v && typeof v == 'object')? isValid (pred) (v): pred (v) ) const noEmptyProps = isValid (v => v:== '' && v,= null) const obj = [{mainContact: true, contactName: "". emailId, "abc@gmail:com": contactAddress, [{addressType: "". county. "U,K:", postCode: "MK7 6BZ", houseFlatNumber: 1}, {addressType: "def", county: "France", postCode: "123MKO", houseFlatNumber: "223"}]: phoneDetails, [{notes: "", phoneNumber: "1234567899", countryCode: "44", priority: "1"}, {notes: "Lorem ipsum", phoneNumber: "1112223331", countryCode: "48". priority: "2"}]}] console.log (noEmptyProps (obj))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM