最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Cannot Read Property of Undefined using Reduce - Stack Overflow

programmeradmin5浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论