dikuw
dikuw

Reputation: 1158

Can this Function Be Written with Reduce()?

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

Answers (3)

Karthick Ramachandran
Karthick Ramachandran

Reputation: 651

You can rewrite the method like this,

function getTotalHours() {
  return myActivities.reduce((sum, activity) => {
    return sum + getHours(activity)
  }, 0);
}

Upvotes: 1

uminder
uminder

Reputation: 26150

Try this...

myActivities.reduce((acc, v) => acc +  v.segments.filter(seg => seg).length, 0);

Upvotes: 3

waiaan
waiaan

Reputation: 220

var total = 0;

    total=myActivities.reduce((sum, activity, index, arr) => {
      sum += getHours(activity);
      return sum;
    }, 0)

    console.log(total);

Upvotes: 0

Related Questions