admin管理员组

文章数量:1355128

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 (panies) {
  var ret = panies.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));

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 (panies) {
  var ret = panies.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));
Share Improve this question asked May 2, 2017 at 5:15 user3628240user3628240 9273 gold badges25 silver badges43 bronze badges 1
  • Ok, thank you very much! – user3628240 Commented May 2, 2017 at 5:28
Add a ment  | 

2 Answers 2

Reset to default 5

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 (panies) {
  var ret = panies.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));

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:

This fixed the issue.

本文标签: javascriptCannot Read Property of Undefined using ReduceStack Overflow