Цикл по JSON — требуется логика для подсчета суммы значений

#python #json #algorithm #typescript #logic

#python #json #алгоритм #typescript #Логические

Вопрос:

Я пытаюсь получить сумму значений ключа number из приведенного ниже JSON.

сумма = 193(21 52 52 68)

Я буду использовать циклы здесь вместо прямого доступа — response[‘jobs’][‘0’][‘lastBuild’][‘number’]. Может кто-нибудь, пожалуйста, предоставить логику? подойдет любой язык программирования.

 {
"_class": "hudson.model.Hudson",
"jobs": [
    {
        "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
        "name": "ADP-CHINA-IT",
        "lastBuild": {
            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
            "number": 21
        }
    },
    {
            "_class": "com.cloudbees.hudson.plugins.folder.Folder",
            "name": "A",
            "jobs": [
                {
                    "_class": "hudson.model.FreeStyleProject",
                    "name": "dummy",
                    "lastBuild": {
                        "_class": "hudson.model.FreeStyleBuild",
                        "number": 52
                    }
                },
                {
                    "_class": "com.cloudbees.hudson.plugins.folder.Folder",
                    "name": "F",
                    "jobs": [
                        {
                            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
                            "name": "pipeline",
                            "lastBuild": {
                                "_class": "hudson.model.FreeStyleBuild",
                                "number": 52
                            }
                        }
                    ]
                }
            ]
        },
        {
            "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
            "name": "CICD_Windows_Shared_Lib_Test",
            "lastBuild": {
                "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
                "number": 68
            }
        }


]
  

}

Комментарии:

1. Это похоже на структурированный вывод, соответствующий иерархии папок. Означает ли это, что number ключ может быть вложен на любом уровне?

2. @DroidX86 да, цифровой ключ может быть вложен на любом уровне.

Ответ №1:

python:

 def sum_(s, dict_):
    return s   reduce(sum_, dict_.get("jobs", []), 0)   dict_.get("lastBuild", {}).get("number", 0)


reduce(sum_, response["jobs"], 0)
  

Комментарии:

1. функция reduce из functools

2. Можем ли мы иметь такую же логику в typescript?

Ответ №2:

Используйте Array.prototype.reduce рекурсивно:

 type Job = {lastBuild: {number: number}, jobs?: Job[]}

const reduction = (acc: number, job:Job) => acc   job.lastBuild.number 
        (job.jobs ? job.jobs.reduce(reduction,0) : 0); // recursion

response.jobs.reduce(reduction, 0);