I have an array of objects
[
{
id: 1,
name: "dashboard",
permissions: {
view: {
default_checked: false,
custom_checked: true,
},
add: {
default_checked: false,
custom_checked: true,
},
},
},
{
id: 2,
name: "user",
permissions: {
view: {
default_checked: false,
custom_checked: true,
},
add: {
default_checked: false,
custom_checked: false,
},
},
},
{
id: 3,
name: "contact",
permissions: {
view: {
default_checked: false,
custom_checked: false,
},
add: {
default_checked: false,
custom_checked: false,
},
},
},
]
What I want to do is filter only objects which has custom_checked: true inside permissions object and remove other falsy (view, add) objects, so the output would be
[
{
id: 1,
name: "dashboard",
permissions: {
view: {
custom_checked: true,
},
add: {
custom_checked: true,
},
},
},
{
id: 2,
name: "user",
permissions: {
view: {
custom_checked: true,
},
},
},
]
I have tried
const testArr = [];
arr.forEach((v) => {
for (let [key, value] of Object.entries(v.permissions)) {
if (value.custom_checked) {
testArr.push({
...v,
permissions: {
[key]: {
custom_checked: true,
},
},
});
}
}
});
console.log(testArr);
But I think since I am looping through v.permissions object inside, the output is separating and getting objects one by one. How do I solve this?
const filter = arr.filter((item) => { const { permissions } = item; const keys = Object.keys(permissions); const filtered = keys.filter((key) => permissions[key].custom_checked === true); filtered.forEach((key) => { const { [key]: value, ...rest } = permissions; item.permissions = rest; }); return filtered.length > 0; }); console.log(filter);