Я пытаюсь получить массив значений объекта в массиве, используя вложенный цикл for. Я получаю данные json, как показано ниже. Для этого я написал код машинописного текста, как показано ниже. Но я не могу получить желаемые результаты для привязки значений к шаблону. Смотрите ниже мой код.

Это мой машинописный код:

let totalData = results['data'];
     for (var i=0; i<totalData.length; i++)
        for (var task in totalData[i]) {
            console.log("Task: "+task);
            console.log("totalTests: "+task['totalTestCompleted']);
            console.log("totalOpenIssues: "+totalData[i][task].totalOpenIssues);
        }

Ниже приведены данные json, которые я получаю из остальных API.

   [
    {  
          "id":"8a8080f06610359c0166103cf22c7032",
          "createdDate":"2018-09-25T10:18:41.580+0000",
          "inactive":false,
          "job":{  
             "id":"8a80809465ebb03f0165ebf9a780009b",
             "createdDate":"2018-09-18T09:18:51.775+0000",
             "inactive":false,
             "project":{  
                "id":"8a8080a565e5c6f90165e5dc7d950089",
                "createdDate":"2018-09-17T04:49:17.205+0000",
                "inactive":false,
                "name":"testproject917",
                "org":{  
                   "id":"8a8080cf65e02c0f0165e031fb9e0003",
                   "createdBy":"anonymousUser",
                   "createdDate":"2018-09-16T02:24:56.734+0000",
                   "inactive":false,
                   "name":"Google"
                }
             },
             "name":"prod",
             "refId":"prod",
             "description":null,
             "environment":{  
                "id":"8a80809465ebb03f0165ebf9a779009a",
                "createdDate":"2018-09-18T09:18:51.769+0000",
                "inactive":false,
                "baseUrl":" http://www.google.com",
                "auths":[  
                   {  
                      "name":"prodenv",
                      "authType":"Basic",
                      "username":"Google//admin@google.io",
                      "password":"4+Coma/w5kOSlofdJLeBT6b4tdGNrVbE"
                   }
                ]
             },
             "issueTracker":{  
                "id":"8a80809465ebb03f0165ebf9a780009c",
                "name":"Dev-IssueTracker"
             },
             "notifications":[  
                {  
                   "id":12,
                   "name":"Dev-Email-Notification"
                },
                {  
                   "id":null,
                   "name":"Default_Slack"
                }
             ],
             "categories":"",
             "notificationToDo":false,
             "issueTrackerToDo":false,
             "openIssues":0,
             "closedIssues":0
          },
          "runId":9,
          "task":{  
             "name":"Tue Sep 25 10:18:41 UTC 2018",
             "description":"Invalid Region: US_WEST_1",
             "status":"FAIL",
             "totalTests":0,
             "totalOpenIssues":0
          },
          "attributes":{  
             "REGION":"US_WEST_1"
          },
          "regions":"US_WEST_1",
          "stats":{  

          },
          "validations":null,
          "ciCdStatus":"FAIL:Invalid Region: US_WEST_1FAIL:0.0:0:0:"
       },
       {}
       ]

Я пытаюсь получить ключ и значения объекта задачи, как показано ниже

task.totalTests
task.totalOpenIssues

Когда я пытаюсь получить массив значений объекта json, я получаю эту ошибку:

ERROR TypeError: Cannot read property 'totalTestCompleted' of null

Итак, моя идея - привязать эти значения к шаблону. Для этого я написал все, но я не могу получить массив значений объекта json. Кто-нибудь может мне в этом помочь?

Спасибо.

-1
youi 25 Сен 2018 в 16:32

2 ответа

Лучший ответ

Не все ваши элементы содержат информацию о задаче, поэтому вам нужно ее проверить.

for (var key in totalData) {
  console.log('Task id: ' + key);
  // You have an empty item in the end
  if (totalData[key].task) {
        console.log('Total tests: ' + totalData[key].task.totalTests);
    console.log('Total open issues: ' + totalData[key].task.totalOpenIssues);
  }
  else {
    console.log('No task');
  }
}

Еще одно примечание: for (var task in totalData[i]) вернет все ключи объекта:

var o = { a: 1, b: 2 };
for (var k in o) {
  console.log('Key: ' + k);
}

// The above will log
Key: a
Key: b

То, как вы его использовали, вы получили все ключи:

id
createdDate
inactive
job
and so on...
1
Asken 25 Сен 2018 в 14:02

В вашем коде есть некоторые проблемы. Согласно приведенным вами данным, вам не нужны вложенные циклы. Кроме того, в ваших данных нет ключа totalTestCompleted.

let totalData = results['data'];
for (var i=0; i<totalData.length; i++) {
    // totalTestCompleted doesn't exist: console.log("totalTests: "+task.totalTestCompleted);
    console.log("totalOpenIssues: "+ totalData[i].task.totalOpenIssues);
}
1
makmonty 25 Сен 2018 в 13:43