[英]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 的解釋,我在其中添加了一個簡單的基本情況來檢查傳遞的值是null
、 undefined
還是空字符串。
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.