I expect true
for below usage of every
but it wasn’t, what’s wrong with my logic?
JavaScript
x
29
29
1
const isAllChecked = [
2
{
3
"id": "1",
4
"checked": true,
5
},
6
{
7
"id": "2",
8
"checked": true,
9
"nested": [
10
{
11
"id": "2.1",
12
"checked": true,
13
},
14
{
15
"id": "2.2",
16
"checked": true,
17
}
18
]
19
},
20
{
21
"id": "3",
22
"checked": true,
23
},
24
].every(
25
(o) =>
26
o.checked &&
27
o.nested?.every((o) => o.checked)
28
)
29
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
JavaScript
1
4
1
(o) =>
2
o.checked &&
3
o.nested?.every((o) => o.checked)
4
will evaluate to
JavaScript
1
4
1
(o) =>
2
true
3
undefined
4
You probably wanted
JavaScript
1
4
1
(o) =>
2
o.checked &&
3
(!o.nested || o.nested.every((o) => o.checked))
4
or
JavaScript
1
4
1
(o) =>
2
o.checked &&
3
(o.nested || []).every(o => o.checked)
4
JavaScript
1
29
29
1
const isAllChecked = [
2
{
3
"id": "1",
4
"checked": true,
5
},
6
{
7
"id": "2",
8
"checked": true,
9
"nested": [
10
{
11
"id": "2.1",
12
"checked": true,
13
},
14
{
15
"id": "2.2",
16
"checked": true,
17
}
18
]
19
},
20
{
21
"id": "3",
22
"checked": true,
23
},
24
].every(
25
(o) =>
26
o.checked &&
27
(o.nested || []).every((o) => o.checked)
28
)
29
console.log(isAllChecked);