【问题标题】:How to count number of values in array?如何计算数组中值的数量?
【发布时间】:2019-11-09 03:19:56
【问题描述】:

我正在尝试计算一个 json 数组的值。

如果“beta = b”,我想计算“sierra”数据数组中id的数量。因此,根据设置为值 'b' 的环境变量 ("B") 检查 data[].beta 的值。

这里的问题是我在 data[] 的每次迭代中都没有“sierra”。

{
  "data": [{
        "alpha": "a",
        "beta": "b",
        "delta": {
            "cat": "dog"
        },
        "gamma": {
            "sierra": {
                "data": [
                    {
                        "type": "alphabet",
                        "id": "a"
                    },
                    {
                        "type": "alphabet",
                        "id": "b"
                    }
                ]
            }
        }
   },
{
        "alpha": "a",
        "beta": "b",
        "delta": {
            "cat": "dog"
        },
        "bravo": {
                "data": [
                    {
                        "type": "number",
                        "id": "1"
                    },
                    {
                        "type": "number",
                        "id": "2"
                    }
                ]
            }
        }
   },
{
        "alpha": "x",
        "beta": "y",
        "delta": {
            "cat": "dog"
        },
        "gamma": {
            "sierra": {
                "data": [
                    {
                        "type": "alphabet",
                        "id": "c"
                    },
                    {
                        "type": "alphabet",
                        "id": "d"
                    }
                ]
            }
        }
   }]
}

json 上面是我在 postman 中看到的响应体。 “循环”是我的“for”循环的计数。

编辑 1: 我试过这个:

1. pm.response.json().data[loop].gamma.sierra.data().id).size()

2. for(var loop =0; loop < pm.response.json().data.length; loop++)
{
 if(pm.response.json().data[loop].beta===pm.variables.get("B"))
{      
        pm.response.json().data.map((item, loop) => {
            if(item.gamma){ // check if gamma key is present
                console.log(item.gamma.sierra.filter(data =>data.id 
                                                      ).length); // 
            }
        });
        result=true;
        break;

    }
}
pm.expect(true).to.eql(result);

预计:2

Actual: TypeError: Cannot read property 'sierra' of undefined
Actual: item.relationships.apps.filter is not a function

【问题讨论】:

  • 代码中的loop 是什么?
  • 可以通过pm.response.json().data[loop].gamma.sierra.data().length找到
  • 先尝试登录pm.response.json().data[loop]data[loop] 中的一个或几个似乎缺少 gamma 键。
  • @MihaiAlexandru-Ionut 我猜他正在运行一个循环,loop 是索引号。
  • 您试图调用一个不存在的函数:.sierra.data()。在您的 casa 中,数据只是一个数组。

标签: javascript arrays json postman postman-testcase


【解决方案1】:
pm.response.json().data.map((item, loop) => {
    if(item.beta === "b" && item.gamma){ // check if gamma key is present

        console.log(item.gamma.sierra.data.filter(data => data.id).length); // 
    }
});

Jsfiddle

【讨论】:

  • TypeError: item.gamma.filter 不是函数
  • 这行得通,但它给出了我拥有的每个山脉的数量。我像这样将 if 循环添加到您的代码中。 if(pm.response.json().data[loop].id===pm.variables.get("B")){ //your code here } 仍然给出计数为 2、2。它似乎没有区别。
  • 删除你的外部'for'循环并检查更新的代码
  • 它不会进入if(item.gamma) 循环!
  • 嗯,那么“循环”到底在做什么呢?那是“for”循环的替代品吗?
【解决方案2】:

您可以使用以下代码:

pm.response.json().data[0].gamma.sierra.data.filter( d =&gt; d.id ).length

希望对你有帮助。

【讨论】:

  • 这里的“d”是什么?你能解释一下吗?
  • filter 实际上是循环遍历数据数组,d 只是表示循环中的当前元素。
  • d =&gt; d.id 表示function whatecer(d){ return d.id } 它基本上是对每个数组元素调用的回调 - 它检查它是否有id,如果有,它会将一个元素进一步传递给.length
【解决方案3】:

您可以采用动态方法并交出您喜欢计算某个内键的对象的键。

function count(object, key, subKey) {
    const noObject = o => !o || typeof o !== 'object';

    function subCount(object) {
        if (noObject(object)) return 0;
        if (subKey in object) return 1;
        return Object.values(object).reduce((s, o) => s + subCount(o), 0);
    }

    if (noObject(object)) return 0;
    if (key in object) return subCount(object[key]);
    return Object.values(object).reduce((s, o) => s + count(o, key, subKey), 0);
}

var data = { data: [{ alpha: "a", beta: "b", delta: { cat: "dog" }, gamma: { sierra: { data: [{ type: "alphabet", id: "a" }, { type: "alphabet", id: "b" }] } } }] };

console.log(count(data, 'sierra', 'id')); // 2

【讨论】:

  • 这对我有用 :-) 非常感谢!你能解释一下这背后的逻辑吗?非常感谢您的帮助。
  • 它检查一个键是否存在并移交给 subCount 或迭代所有值并递归调用count。如果找到密钥,它会查找想要的(子)密钥并通过返回一个来计算它。
  • 这确实是我一整天能找到的唯一解决方案!
【解决方案4】:

您可以像这样访问它。如果您有多个数据记录,您也可以使用每个循环来计算。

a = {
 "data": [ 
 {
        "alpha": "a",
        "beta": "b",
        "delta": {
            "cat": "dog"
        },
        "gamma": {
            "sierra": {
                "data": [
                    {
                        "type": "alphabet",
                        "id": "a"
                    },
                    {
                        "type": "alphabet",
                        "id": "b"
                    }
                ]
            }
        }
    }
]
}

console.log(a.data[0].gamma.sierra.data.length);

【讨论】:

  • 显然我没有把我的问题说清楚。现在我已经编辑了更多细节。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2010-12-03
  • 2015-06-15
  • 1970-01-01
  • 2016-06-24
  • 2020-06-06
相关资源
最近更新 更多