如何在javascript中调用递归函数

如何在javascript中调用递归函数,javascript,angularjs,json,Javascript,Angularjs,Json,在我的组件列表中将有多个对象 if ($scope.componentList && $scope.componentList.length > 0) { angular.forEach($scope.componentList, function(admincomp, index) { $scope.validateAdmincomp(admincomp, index); }); } $scope.validateA

在我的
组件列表中
将有多个对象

if ($scope.componentList && $scope.componentList.length > 0) {
       angular.forEach($scope.componentList, function(admincomp, index) {
          $scope.validateAdmincomp(admincomp, index);
       });
 }



$scope.validateAdmincomp = function(admincomp, index) {
     for (var key in admincomp) {
       if (key !== "$$hashKey" && admincomp.hasOwnProperty(key)) {
           angular.element(document.querySelector('#' + key + index)).removeClass("errorhilight");
                }
            }
       if (admincomp.componentName == undefined || admincomp.componentName == "") {    
             angular.element(document.querySelector('#componentName' + index)).addClass("errorhilight");
                isValidData = false;
            }
};
$scope.componentList
格式如下

[
  {
    "revision": 0,  
    "componentName": "abc",
    "componentIdentification": "abc",
    "componentType": "1",
    "componentState": "1",
    "componentUrl": null,
    "componentId": "214",
    "rowId": "3",
    "items": [
      {
        "revision": 0,
        "componentName": "efg",
        "componentIdentification": "efg",
        "componentType": "2",
        "componentState": "1",
        "componentUrl": null,
        "componentId": "215",
        "rowId": "3.1",
        "items": null,
        "componentStateId": 0,
        "ctastatus": 0,
        "actionId": "16",
        "actionToPerform": "1"
      }
    ],
    "componentStateId": 0,
    "ctastatus": 0,
    "actionId": "37",
    "actionToPerform": "1"
  },
  {
    "revision": 0,
    "componentName": "hij",
    "componentIdentification": "hij",
    "componentType": "1",
    "componentState": "1",
    "componentUrl": null,
    "componentId": "206",
    "rowId": "1",
    "items": [
      {
        "revision": 0,
        "componentName": "klm",
        "componentIdentification": "klm",
        "componentType": "2",
        "componentState": "1",
        "componentUrl": null,
        "componentId": "207",
        "rowId": "1.1",
        "items": [
          {
            "revision": 0,
            "componentName": "nop",
            "componentIdentification": "nop",
            "componentType": "2",
            "componentState": "1",
            "componentUrl": null,
            "componentId": "208",
            "rowId": "1.1.1",
            "items": [
              {
                "revision": 0,
                "componentName": "qrs",
                "componentIdentification": "qrs",
                "componentType": "2",
                "componentState": "1",
                "componentUrl": null,
                "componentId": "209",
                "rowId": "1.1.1.1",
                "items": null,
                "componentStateId": 0,
                "ctastatus": 0,
                "actionId": "26",
                "actionToPerform": "1"
              },
              {
                "revision": 0,
                "componentName": "tuv",
                "componentIdentification": "tuv",
                "componentType": "2",
                "componentState": "1",
                "componentUrl": null,
                "componentId": "210",
                "rowId": "1.1.1.2",
                "items": null,
                "componentStateId": 0,
                "ctastatus": 0,
                "actionId": "5",
                "actionToPerform": "1"
              }
            ],
            "componentStateId": 0,
            "ctastatus": 0,
            "actionId": "25",
            "actionToPerform": "1"
          }
        ],
        "componentStateId": 0,
        "ctastatus": 0,
        "actionId": "1",
        "actionToPerform": "1"
      }
    ],
    "componentStateId": 0,
    "ctastatus": 0,
    "actionId": "37",
    "actionToPerform": "1"
  },
  {
    "revision": 0,
    "componentName": "wxy",
    "componentIdentification": "wxy",  
    "componentType": "1",
    "componentState": "1",
    "componentUrl": null,
    "componentId": "211",
    "rowId": "2",
    "items": [
      {
        "revision": 0,
        "componentName": "zab",
        "componentIdentification": "zab",
        "componentType": "2",
        "componentState": "1",
        "componentUrl": null,
        "componentId": "212",
        "rowId": "2.1", 
        "items": null,
        "componentStateId": 0,
        "ctastatus": 0,
        "actionId": "7",
        "actionToPerform": "1"
      },
      {
        "revision": 0,
        "componentName": "cde",
        "componentIdentification": "cde",
        "componentType": "2",
        "componentState": "1",
        "componentUrl": null,
        "componentId": "213",
        "rowId": "2.2",
        "items": null,
        "componentStateId": 0,
        "ctastatus": 0,
        "actionId": "12",
        "actionToPerform": "1"
      }
    ],
    "componentStateId": 0,
    "ctastatus": 0,
    "actionId": "37",
    "actionToPerform": "1"
  }
]
在上面的代码中,父级仅在forEach循环只考虑
$scope.componentList
列表而不考虑内部
项[]
列表时进行验证。我想为每个对象调用
validateAdmincomp
函数。
如何调用每个对象的
validateAdmincomp
函数。

使用以下代码。将迭代逻辑移动到方法(递归方法)


使用下面的代码。将迭代逻辑移动到方法(递归方法)


我不确定你是否在找这个。它将迭代每个键,如果它是一个对象而不是null,它将使用该对象调用函数

var列表=[
{
“修订”:0,
“组件名称”:“abc”,
“组件标识”:“abc”,
“组件类型”:“1”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“214”,
“rowId”:“3”,
“项目”:[
{
“修订”:0,
“组件名称”:“efg”,
“组件标识”:“efg”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“215”,
“rowId”:“3.1”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“16”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“状态”:0,
“actionId”:“37”,
“actionToPerform”:“1”
},
{
“修订”:0,
“组件名称”:“hij”,
“组件标识”:“hij”,
“组件类型”:“1”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“206”,
“rowId”:“1”,
“项目”:[
{
“修订”:0,
“组件名称”:“klm”,
“组件标识”:“klm”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“207”,
“rowId”:“1.1”,
“项目”:[
{
“修订”:0,
“组件名称”:“nop”,
“组件标识”:“nop”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“208”,
“rowId”:“1.1.1”,
“项目”:[
{
“修订”:0,
“组件名称”:“qrs”,
“成分识别”:“qrs”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentide”:“209”,
“rowId”:“1.1.1.1”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“26”,
“actionToPerform”:“1”
},
{
“修订”:0,
“组件名称”:“tuv”,
“组件标识”:“tuv”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“210”,
“rowId”:“1.1.1.2”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“5”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“状态”:0,
“actionId”:“25”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“状态”:0,
“actionId”:“1”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“状态”:0,
“actionId”:“37”,
“actionToPerform”:“1”
},
{
“修订”:0,
“组件名称”:“wxy”,
“组件标识”:“wxy”,
“组件类型”:“1”,
“组件状态”:“1”,
“componentUrl”:空,
“组件化”:“211”,
“rowId”:“2”,
“项目”:[
{
“修订”:0,
“组件名称”:“zab”,
“组件标识”:“zab”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“212”,
“rowId”:“2.1”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“7”,
“actionToPerform”:“1”
},
{
“修订”:0,
“组件名称”:“cde”,
“组件标识”:“cde”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“213”,
“rowId”:“2.2”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“12”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“状态”:0,
“actionId”:“37”,
“actionToPerform”:“1”
}
]
功能记录(obj){
用于(输入obj){
if(对象[键]=“对象”&&obj[键]的类型){
控制台日志(键);
rec(obj[键]);
}
}
}
list.forEach(函数(o){
rec(o);

})
我不确定您是否在找这个。它将迭代每个键,如果它是一个对象而不是null,它将使用该对象调用函数

var列表=[
{
“修订”:0,
“组件名称”:“abc”,
“组件标识”:“abc”,
“组件类型”:“1”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“214”,
“rowId”:“3”,
“项目”:[
{
“修订”:0,
“组件名称”:“efg”,
“组件标识”:“efg”,
“组件类型”:“2”,
“组件状态”:“1”,
“componentUrl”:空,
“componentId”:“215”,
“rowId”:“3.1”,
“项目”:空,
“componentStateId”:0,
“状态”:0,
“actionId”:“16”,
“actionToPerform”:“1”
}
],
“componentStateId”:0,
“c
if ($scope.componentList && $scope.componentList.length > 0) {
    validateList($scope.componentList) // starting point to iterate and validate the list
}

var validateList = function(list) {
    angular.forEach(list, function(admincomp, index) {
        $scope.validateAdmincomp(admincomp, index); // considering this method is doing some other validations
        if (admincomp.items && admincomp.items.lenght > 0)
            validateList(admincomp.items); // method calling itself
    });
}