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.
CodePudding user response:
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);
CodePudding user response:
In the absence of a nested property, o.nested? will evaluate to a falsy value.
You could use a combination of every() and some():
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?.some((o) => !o.checked));
console.log(isAllChecked);
CodePudding user response:
If an item doesn't contain the nested property then o.nested?.every((o) => o.checked) will evaluate to false, hence the every method would also return false.
You can instead use Array.prototype.some for the checking the items inside the nested array.
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?.some((o) => !o.checked));
console.log(isAllChecked);
