Let's take a closer look at using Javascript's built in Array reduce function. Reduce is deceptively simple and when harnessed correctly can achieve very powerful results. By leveraging reduce, we can answer a variety of questions on a single, simple data set. In this lesson, we'll look at how you might useArray.prototype.reduce to:

  • Sum an array of numbers
  • Reduce an array of objects to a sum of a given property
  • Group an array of objects by key or a set of given criteria
  • Count the number of objects in an array by key or a given set of criteria
let numbers = [1,2,3,4,5];

console.clear();

numbers.reduce(function(preVal, curVal, index, array){
  console.log({preVal, curVal, index, array});
  return curVal;
});

/*
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 2,
  index: 1,
  preVal: 1
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 3,
  index: 2,
  preVal: 2
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 4,
  index: 3,
  preVal: 3
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 5,
  index: 4,
  preVal: 4
}

*/

reduce() start from the second value in the array.

 

If there is no return value which will be passed to the next object as a previous value, then the next previous value will be undefined:

var numbers = [1,2,3,4,5];

console.clear();

numbers.reduce(function(preVal, curVal, index, array){
  console.log({preVal, curVal, index, array});
});

/*
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 2,
  index: 1,
  preVal: 1
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 3,
  index: 2,
  preVal: undefined
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 4,
  index: 3,
  preVal: undefined
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 5,
  index: 4,
  preVal: undefined
}
*/

 

 

You can give another parameter to let it start from the first element of the array:

numbers.reduce(function(preVal, curVal, index, array){
  console.log({preVal, curVal, index, array});
  return curVal;
}, "start");

/**
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 1,
  index: 0,
  preVal: "start"
}
[object Object] {
  array: [1, 2, 3, 4, 5],
  curVal: 2,
  index: 1,
  preVal: 1
}
...
...
*/

 

Sum up an number of array:

let numbers = [1,2,3,4,5];

console.clear();

var sum = numbers.reduce( (preVal, curVal) => preVal + curVal);
console.log("sum: " + sum);

/*
Sum: 15
*/

 

Example 2:

let people = [
  {
    name: 'Joe mins',
    yearsExperience: 1,
    dapartment: 'IT'
  },
  {
    name: "Sally koral",
    yearsExperience: 15,
    dapartment: 'Engineering'
  },
  {
    name: "Bill Fork",
    yearsExperience: 5,
    dapartment: 'Engineering'
  },
  {
    name: 'Jane James',
    yearsExperience: 11,
    dapartment: 'Manager'
  },
  {
    name: 'Bob Super',
    yearsExperience: 9,
    dapartment: 'IT'
  },
];

console.clear();

var yearsExperience = people.reduce( (sum, curVal) => sum + curVal.yearsExperience, 0);

console.log(yearsExperience);  //41

 

Group by object:

let people = [
  {
    name: 'Joe mins',
    yearsExperience: 1,
    dapartment: 'IT'
  },
  {
    name: "Sally koral",
    yearsExperience: 15,
    dapartment: 'Engineering'
  },
  {
    name: "Bill Fork",
    yearsExperience: 5,
    dapartment: 'Engineering'
  },
  {
    name: 'Jane James',
    yearsExperience: 11,
    dapartment: 'Manager'
  },
  {
    name: 'Bob Super',
    yearsExperience: 9,
    dapartment: 'IT'
  },
];

console.clear();

var departmentExperienceYears = people.reduce( (groupByObject, employee) => {
  let dapartment = employee.dapartment;
  if(!groupByObject[dapartment]){
    groupByObject[dapartment] = 0;
    groupByObject[dapartment] += employee.yearsExperience;
  }
  
  return groupByObject;
}, {});

console.log(departmentExperienceYears);

/*
[object Object] {
  Engineering: 15,
  IT: 1,
  Manager: 11
}
*/