#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);