Vimalraj Selvam
Vimalraj Selvam

Reputation: 2245

Filter the nested array based on condition

I have an object like this:

runs = 
    {
        "suites": [
            {
                "status": "fail",
                "testcases": [
                    {
                        "status": "pass"
                    },
                    {
                        "status": "fail"
                    }
                ]
            },
            {
                "status": "pass",
                "testcases": [
                    {
                        "status": "pass"
                    }
                ]
            }
        ]
    }

I would like to retrieve the count of test case pass and fail (In the above case pass: 2, fail: 1). I tried the following to get the pass count:

runs.suites.filter(suite => {
    suite.testcases.filter(testcase => {
        return testcase.status === 'pass';
    })
}).length

But it is giving me an incorrect result.

Upvotes: 0

Views: 68

Answers (4)

rejo
rejo

Reputation: 3350

Try this

// Code goes here

    runs = 
        {
            "suites": [
                {
                    "status": "fail",
                    "testcases": [
                        {
                            "status": "pass"
                        },
                        {
                            "status": "fail"
                        }
                    ]
                },
                {
                    "status": "pass",
                    "testcases": [
                        {
                            "status": "pass"
                        }
                    ]
                }
            ]
        };
        var count = 0;
        var test = runs.suites.filter(suite => {
            suite.testcases.filter(testcase => {
                (testcase.status=='pass')?count++:count;
            })
            return count;
        });

    console.log(test.length);

Upvotes: 1

Michał Perłakowski
Michał Perłakowski

Reputation: 92669

Try this:

var runs = {"suites": [{"status": "fail","testcases": [{"status": "pass"},{"status": "fail"}]},{"status": "pass","testcases": [{"status": "pass"}]}]};

const statuses = runs.suites.reduce((a, b)=> a.testcases.concat(b.testcases)).map(x=> x.status)
console.log(statuses.filter(x=> x === "pass").length) // 2
console.log(statuses.filter(x=> x === "fail").length) // 1

Upvotes: 1

Jose Hermosilla Rodrigo
Jose Hermosilla Rodrigo

Reputation: 3683

You can use Array#reduce and take the count of pass/fail in an object {pass : 2, fail : 1}

var runs = {"suites": [{"status": "fail","testcases": [{"status": "pass"},{"status": "fail"}]},{"status": "pass","testcases": [{"status": "pass"}]}]};

var obj = runs.suites.reduce( (tot, curr)=> {
  curr.testcases.forEach(tc=>{
    tc.status === 'pass' ? tot.pass++ : tot.fail++;
  });
  return tot;
}, {pass : 0, fail : 0});

console.log(obj);

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386816

You could use an object for counting.

var runs = { "suites": [{ "status": "fail", "testcases": [{ "status": "pass" }, { "status": "fail" }] }, { "status": "pass", "testcases": [{ "status": "pass" }] }] },
count = {}

runs.suites.forEach(a => 
    a.testcases.forEach(b =>
        count[b.status] = (count[b.status] || 0) + 1));

console.log(count);

Upvotes: 1

Related Questions