I expect true for below usage of every but it wasn’t, what’s wrong with my logic?
const isAllChecked = [
{
"id": "1",
"checked": true,
},
{
"id": "2",
"checked": true,
"nested": [
{
"id": "2.1",
"checked": true,
},
{
"id": "2.2",
"checked": true,
}
]
},
{
"id": "3",
"checked": true,
},
].every(
(o) =>
o.checked &&
o.nested?.every((o) => o.checked)
)
What I wanted: if any of the level 1 checked or nested checked is false then isAllChecked is false, but if non of the checked property in level 1 or nested is false, isAllChecked should return true.
Advertisement
Answer
Optional chaining will evaluate to undefined if the chain fails, so for the second iteration
(o) => o.checked && o.nested?.every((o) => o.checked)
will evaluate to
(o) => true undefined
You probably wanted
(o) => o.checked && (!o.nested || o.nested.every((o) => o.checked))
or
(o) => o.checked && (o.nested || []).every(o => o.checked)
const isAllChecked = [
{
"id": "1",
"checked": true,
},
{
"id": "2",
"checked": true,
"nested": [
{
"id": "2.1",
"checked": true,
},
{
"id": "2.2",
"checked": true,
}
]
},
{
"id": "3",
"checked": true,
},
].every(
(o) =>
o.checked &&
(o.nested || []).every((o) => o.checked)
)
console.log(isAllChecked);