javascript - 遍历子节点并查找属性(最多n层)

标签 javascript json recursion

我们有一个 JSON 文件:

var response = {
  "Status": "Met",
  "Text": "Text1",
  "Id": "AAA",
  "ContentItems": [
    {
      "Selected": true,
      "Text": "Text2",
      "Id": "BBB"
    },
    {
      "Status": "Met",
      "Text": "Text3",
      "Id": "CCC",          
      "ContentItems": [
        {
          "Selected": true,
          "Text": "Text5",
          "Id": "DDD"
        },
        {
          "Status": "Met",
          "Text": "Text6",
          "Id": "EEE",
          "ContentItems": [
            {
              "Selected": true,
              "Text": "Text7",
              "Id": "FFF"
            },
            {
              "Selected": true,
              "Text": "Text8",
              "Id": "GGG"
            },
            {
              "Status": "Met",
              "Text": "Text9",
              "Id": "III",
              "ContentItems": [
                {
                  "Status": "Met",
                  "Text": "Text11",
                  "Id": "JJJ",
                  "ContentItems": [
                    {
                      "Text": "Text12",
                      "Id": "77"
                    },
                    {
                      "Status": "Met",
                      "Text": "Text13",
                      "Id": "10",
                      "ContentItems": [
                        {
                          "Text": "Text14",
                          "Id": "45"
                        },
                        {
                          "Selected": true,
                          "Text": "Text15",
                          "Id": "87"
                        },
                        {
                          "Selected": true,
                          "Text": "Text16",
                          "Id": "80"
                        }
                      ]
                    }                            
                  ]
                },
                {
                  "Status": "Met",
                  "Text": "Text17",
                  "Id": "KKK",
                  "ContentItems": [
                    {
                      "Text": "Text18",
                      "Id": "12"
                    },
                    {
                      "Status": "NotMet",
                      "Text": "Text19",
                      "Id": "14",
                      "ContentItems": [
                        {
                          "Text": "Text20",
                          "Id": "55"
                        },
                        {
                          "Selected": true,
                          "Text": "Text21",
                          "Id": "98"
                        }
                      ]
                    }                            
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
};

从 JSON 文件中,我们需要以下内容:

1.如果所有“Status”均为“Met”,则返回 true。

2.如果任何“Status”为“NotMet”,则返回 false。

由于子节点可以是任意深度;我使用递归函数遍历每个节点,然后从那里循环子节点并递归调用该函数。

我尝试了这段代码,但它没有按预期工作。

function isStatusMet(response) {
  if (response.Status == 'NotMet') {
    return false;
  } else {
    if (response.ContentItems) {
      if(Array.isArray(response.ContentItems)) {
        for(var i = 0; i < response.ContentItems.length;i++) {
          if (response.ContentItems[i].ContentItems) {
            return isStatusMet(response.ContentItems[i]);
          } else {
            if (response.ContentItems[i].Status == 'NotMet') {
              return false;
            } else {
              continue;
            }
          }
        }
        return true;
      }
    } 
  }
}

最佳答案

var isStatusMet = function isStatusMet( data ) {
    // If the status is NotMet, we finish immediately
    if (data.Status === 'NotMet') return false;
    // Since only nodes with ContentItems have a status, we check if the node has children and recursively check if every child has no Status of NotMet
    else if (data.hasOwnProperty('ContentItems')) return data.ContentItems.every(isStatusMet);
    // We're dealing with a child without Status or Childnodes, so we just return true.
    // Since the status in not met and the parent node of this node expects in its 'every' loop that we only return false for nodes that have Status NotMet, this makes the recusion work.
    else return true;
};

var met = isStatusMet(response);

console.log(met);

关于javascript - 遍历子节点并查找属性(最多n层),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022654/

相关文章:

angularjs - 使用来自node.js的angularjs中的json数据作为后端和sql数据库

ios - 如何对 JSON 数组进行排序并将其呈现在 UITableView 中

php - 返回正确的 JSON 响应

java - 汉诺塔,停止滑动

javascript - 是否可以操作 Array.prototype.map() 的索引参数?

javascript - 在mvc中播放.mp4视频时如何停止 slider ?

javascript - 如何绘制三 Angular 形符号?

javascript - Azure 分析 UDF

python - 为什么我的递归函数返回 None?

python - 从边缘列表构建所有哈密顿路径