0

I am trying to apply multiple array.filter at once in a single line, What it doesn't return anything.

let data = [
{
  "name" : "Person1",
  "details":[
    {"status":"A"},
    {"status":"A"},
    {"status":"P"},
    {"status":"A"},
    {"status":"P"}
  ]
},{
  "name" : "Person2",
  "details":[
    {"status":"A"},
    {"status":"A"},
    {"status":"P"},
    {"status":"A"},
    {"status":"P"}
  ]
},{
  "name" : "Person3",
  "details":[
    {"status":"A"},
    {"status":"A"},
    {"status":"P"},
    {"status":"A"},
    {"status":"P"}
  ]
},{
  "name" : "Person4",
  "details":[
    {"status":"A"},
    {"status":"A"},
    {"status":"P"},
    {"status":"A"},
    {"status":"P"}
  ]
}
]

I am trying to collect all the A and P data and push into a single array for further next work.

My array.filter code is here:

var findA = data.filter(Obj=>Obj.details(InnerObj=>InnerObj.status === 'A'))

Am I using it correct because I am not getting anything

Result I want :

[
{
  "name" : "Person1",
  "A" : [
    {"status":"A"},
    {"status":"A"},
    {"status":"A"}
  ],
  "P":[
    {"status":"P"},
    {"status":"P"}
  ]
},{
  "name" : "Person2",
  "A" : [
    {"status":"A"},
    {"status":"A"},
    {"status":"A"}
  ],
  "P":[
    {"status":"P"},
    {"status":"P"}
  ]
}
]
Suraj
  • 61
  • 4

3 Answers3

3

You could map the outer objects and group details.

const
    data = [{ name: "Person1", details: [{ status: "A" }, { status: "A" }, { status: "P" }, { status: "A" }, { status: "P" }] }, { name: "Person2", details: [{ status: "A" }, { status: "A" }, { status: "P" }, { status: "A" }, { status: "P" }] }, { name: "Person3", details: [{ status: "A" }, { status: "A" }, { status: "P" }, { status: "A" }, { status: "P" }] }, { name: "Person4", details: [{ status: "A" }, { status: "A" }, { status: "P" }, { status: "A" }, { status: "P" }] }],
    result = data.map(({ name, details }) => ({ name, ...details.reduce((r, o) => {
        (r[o.status] ??= []).push(o);
        return r;
    }, {}) }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
0

To transform your data you can use map and filter with destructuring like this:

let data=[{name:"Person1",details:[{status:"A"},{status:"A"},{status:"P"},{status:"A"},{status:"P"}]},{name:"Person2",details:[{status:"A"},{status:"A"},{status:"P"},{status:"A"},{status:"P"}]},{name:"Person3",details:[{status:"A"},{status:"A"},{status:"P"},{status:"A"},{status:"P"}]},{name:"Person4",details:[{status:"A"},{status:"A"},{status:"P"},{status:"A"},{status:"P"}]}];

const result = data.map(({ name, details }) => {
const A = details.filter(({ status }) => status === 'A');
const P = details.filter(({ status }) => status === 'P');
return {
    name,
    A,
    P,
};
});

console.log(result);
protob
  • 3,317
  • 1
  • 8
  • 19
-1

sample code

data.filter(obj=>{return (obj.details=obj.details.filter(el=>{return el.status=='A'})).length>0})})