【问题标题】:Looping over JSON - Require Logic to count the sum of values循环 JSON - 需要逻辑来计算值的总和
【发布时间】:2019-04-04 02:58:14
【问题描述】:

我正在尝试从下面的 JSON 中获取键 number 的值的总和。

总和 = 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
            }
        }


]

}

【问题讨论】:

  • 这似乎是对应于文件夹层次结构的结构化输出。这是否意味着number 键可以嵌套在任何级别?
  • @DroidX86 是的,数字键可以嵌套在任何级别。

标签: python json algorithm typescript logic


【解决方案1】:

蟒蛇:

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


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

【讨论】:

  • 函数reduce来自functools
  • 我们可以在 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);

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多