Reputation: 1158
I have a couple functions to first get a total from each object in an array (getHours
) and then get the sum of totals (getTotalHours
). Can the getTotalHours
function be simplified using reduce()
?
const myActivities = [
{
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88125",
activityName: "Sleeping",
segmentLength: 3,
segments: [true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true],
color: "#2AD33F",
sort: 1,
}, {
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88126",
activityName: "Eating",
segmentLength: 3,
segments: [false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false],
color: "#EDF11A",
sort: 2,
}, {
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88127",
activityName: "Projects",
segmentLength: 3,
segments: [false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false],
color: "#D3412A",
sort: 3,
}, {
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88128",
activityName: "Day Job",
segmentLength: 3,
segments: [false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false],
color: "#2D69E2",
sort: 4,
}, {
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88185",
activityName: "Commuting",
segmentLength: 3,
segments: [false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false],
color: "#D32AD1",
sort: 5,
}, {
activityID: "3f4473c4-2a79-11ea-978f-2e728ce88129",
activityName: "Leisure",
segmentLength: 3,
segments: [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false],
color: "#FB8F17",
sort: 6,
},
]
function getHours(activity) {
return activity.segments.filter(seg => seg).length;
}
function getTotalHours() {
let sum = 0;
myActivities.forEach(function(activity) {
sum += getHours(activity);
});
return sum;
}
console.log(getTotalHours());
Upvotes: 1
Views: 48
Reputation: 651
You can rewrite the method like this,
function getTotalHours() {
return myActivities.reduce((sum, activity) => {
return sum + getHours(activity)
}, 0);
}
Upvotes: 1
Reputation: 26150
Try this...
myActivities.reduce((acc, v) => acc + v.segments.filter(seg => seg).length, 0);
Upvotes: 3
Reputation: 220
var total = 0;
total=myActivities.reduce((sum, activity, index, arr) => {
sum += getHours(activity);
return sum;
}, 0)
console.log(total);
Upvotes: 0