user3628240
user3628240

Reputation: 927

Cannot Read Property of Undefined using Reduce

I have an object with sales numbers and want to get return the name and sales of the highest seller, but I keep getting an error of cannot read property of undefined:

var salesTeam = [{name: {first: 'aleen', last: 'atkins'}, age: 26, sales: '$2314'},
        {name: {first: 'alvaro', last: 'angelos'}, age: 55, sales: '$1668'},
        {name: {first: 'denese', last: 'dossett'}, age: 29, sales: '$9248'},
        {name: {first: 'douglas', last: 'denney'}, age: 53, sales: '$5058'},
        {name: {first: 'earline', last: 'erickson'}, age: 19, sales: '$18876'},
        {name: {first: 'herman', last: 'hazell'}, age: 25, sales: '$2746'},
        {name: {first: 'homer', last: 'hirth'}, age: 26, sales: '$474'},
        {name: {first: 'hwa', last: 'heidt'}, age: 53, sales: '$9607'},
        {name: {first: 'hyon', last: 'hampshire'}, age: 46, sales: '$13598'},
        {name: {first: 'issac', last: 'ingerson'}, age: 45, sales: '$5225'},
        {name: {first: 'jeraldine', last: 'joplin'}, age: 39, sales: '$2891'},
        {name: {first: 'jin', last: 'jeffrey'}, age: 17, sales: '$14402'},
        {name: {first: 'joleen', last: 'jolin'}, age: 45, sales: '$15736'},
        {name: {first: 'jude', last: 'jarrett'}, age: 53, sales: '$7557'},
        {name: {first: 'magda', last: 'mireles'}, age: 18, sales: '$1498'},
        {name: {first: 'mistie', last: 'montealegre'}, age: 31, sales: '$6920'},
        {name: {first: 'nancy', last: 'napoli'}, age: 49, sales: '$5255'},
        {name: {first: 'regine', last: 'rohrbaugh'}, age: 33, sales: '$7881'},
        {name: {first: 'rolando', last: 'riebel'}, age: 35, sales: '$8573'},
        {name: {first: 'scarlett', last: 'stagg'}, age: 36, sales: '$7126'},
        {name: {first: 'sherron', last: 'strawn'}, age: 36, sales: '$8848'},
        {name: {first: 'susan', last: 'shilling'}, age: 29, sales: '$8542'},
        {name: {first: 'tama', last: 'tworek'}, age: 16, sales: '$9200'},
        {name: {first: 'tonisha', last: 'taunton'}, age: 41, sales: '$5219'},
        {name: {first: 'vergie', last: 'villescas'}, age: 25, sales: '$8712'}];

var highestEarner = function (companies) {
  var ret = companies.reduce(function(acc,element,i){

    if (parseInt(element['sales'].slice(1)) > acc['sales']){
      acc['sales'] = element['sales'];
      acc['name'] = element['name']['first'] +" "+ element['name']['last'];
    }
  },{sales: 0, name: ''});

  return ret;
};

console.log(highestEarner(salesTeam));

Upvotes: 3

Views: 11064

Answers (2)

Sandeep Amarnath
Sandeep Amarnath

Reputation: 6916

The simple rule while working with reducer is that, whatever data format you have in each element of the array, make sure you are returning the same format including all the elements in every run so that it can use the returned value as accumulator (acc) for the next run.

A simple mistake which I learned from below:

enter image description here

enter image description here

This fixed the issue.

Upvotes: 0

Phil
Phil

Reputation: 164912

You need to return the accumulator in each iteration, ie you are missing return acc after the if {...}. Also, you're assigning the currency-formatted value to acc['sales'] so you'll need to slice and parseInt that too (or just store the numeric value)...

const salesTeam = [{"name":{"first":"aleen","last":"atkins"},"age":26,"sales":"$2314"},{"name":{"first":"alvaro","last":"angelos"},"age":55,"sales":"$1668"},{"name":{"first":"denese","last":"dossett"},"age":29,"sales":"$9248"},{"name":{"first":"douglas","last":"denney"},"age":53,"sales":"$5058"},{"name":{"first":"earline","last":"erickson"},"age":19,"sales":"$18876"},{"name":{"first":"herman","last":"hazell"},"age":25,"sales":"$2746"},{"name":{"first":"homer","last":"hirth"},"age":26,"sales":"$474"},{"name":{"first":"hwa","last":"heidt"},"age":53,"sales":"$9607"},{"name":{"first":"hyon","last":"hampshire"},"age":46,"sales":"$13598"},{"name":{"first":"issac","last":"ingerson"},"age":45,"sales":"$5225"},{"name":{"first":"jeraldine","last":"joplin"},"age":39,"sales":"$2891"},{"name":{"first":"jin","last":"jeffrey"},"age":17,"sales":"$14402"},{"name":{"first":"joleen","last":"jolin"},"age":45,"sales":"$15736"},{"name":{"first":"jude","last":"jarrett"},"age":53,"sales":"$7557"},{"name":{"first":"magda","last":"mireles"},"age":18,"sales":"$1498"},{"name":{"first":"mistie","last":"montealegre"},"age":31,"sales":"$6920"},{"name":{"first":"nancy","last":"napoli"},"age":49,"sales":"$5255"},{"name":{"first":"regine","last":"rohrbaugh"},"age":33,"sales":"$7881"},{"name":{"first":"rolando","last":"riebel"},"age":35,"sales":"$8573"},{"name":{"first":"scarlett","last":"stagg"},"age":36,"sales":"$7126"},{"name":{"first":"sherron","last":"strawn"},"age":36,"sales":"$8848"},{"name":{"first":"susan","last":"shilling"},"age":29,"sales":"$8542"},{"name":{"first":"tama","last":"tworek"},"age":16,"sales":"$9200"},{"name":{"first":"tonisha","last":"taunton"},"age":41,"sales":"$5219"},{"name":{"first":"vergie","last":"villescas"},"age":25,"sales":"$8712"}];

var highestEarner = function (companies) {
  var ret = companies.reduce(function(acc,element) {
    let currentSales = parseInt(element.sales.slice(1))
    if (currentSales > acc.sales) {
      acc.sales = currentSales;
      acc.name = `${element.name.first} ${element.name.last}`
    }
    return acc;
  },{sales: 0, name: ''});

  return ret;
};

console.log(highestEarner(salesTeam));

Upvotes: 5

Related Questions