【问题标题】:Why does my use of javascript's reduce function return "undefined"为什么我使用 javascript 的 reduce 函数返回“未定义”
【发布时间】:2021-10-22 08:52:54
【问题描述】:

1)我有一个对象数组,称为雇员。

2) 我正在尝试在数组中找到薪水最高的员工。

3) 我正在使用 Javascript 的 reduce 函数(在函数 findHighestPaid 内部)这样做。

4) 运行 findHighestPaid(employees) 会返回“未定义”,而我预计它会返回具有属性名称的对象:Abelard。

这是我的代码。

const employees = [
  {
    name: "Aziz",
    salary: 17050,
  },
  {
    name: "Angela",
    salary: 17060,
  },
  {
    name: "Abelard",
    salary: 17070,
  },
];

function findHighestPaid(arrayOfObjects) {
  let myObject = {
    name: "pretendEmployee",
    salary: 17040,
  };

  arrayOfObjects.reduce(myFunction, myObject);

  function myFunction(acc, item) {
    let personSalary = item.salary;
    let accSalary = acc.salary;
    if (Math.sign(personSalary - accSalary) > 0) {
      console.log(`returning object for ${item.name}`);
      return item;
    } else {
      console.log(`returning object for ${acc.name}`);
      return acc;
    }
  } // end myFunction
}

当我运行 findHighestPaid(employees) 并查看控制台时,我看到了:

为 Aziz 返回对象 //(如我所料)

为安吉拉返回对象 //(如我所料)

为 Abelard 返回对象 //(如我所料)

未定义 // (哦哦!!!)

为什么reduce函数返回“undefined”?

【问题讨论】:

  • 因为你忽略了“reduce”的返回值,而“findHighestPaid”没有返回任何东西。不相关但合理的缩进使代码更易于阅读。
  • 我想我现在就放弃编码了。非常感谢!
  • 顺便说一句,也感谢您对缩进的建议。我的借口是我所在的地方已经过了我的就寝时间!最美好的祝愿:)

标签: javascript arrays reduce


【解决方案1】:

最后打印的undefined 是您运行的findHighestPaid() 函数的返回值。

因为你没有返回任何东西,所以它返回了undefined。 如果您的目标是查看 reduce() 的返回值,请在函数中添加一个 return 语句,如下所示:

const employees = [
  {
    name: "Aziz",
    salary: 17050,
  },
  {
    name: "Angela",
    salary: 17060,
  },
  {
    name: "Abelard",
    salary: 17070,
  },
];

function findHighestPaid(arrayOfObjects) {
  let myObject = {
    name: "pretendEmployee",
    salary: 17040,
  };

  return arrayOfObjects.reduce(myFunction, myObject);

  function myFunction(acc, item) {
    let personSalary = item.salary;
    let accSalary = acc.salary;
    if (Math.sign(personSalary - accSalary) > 0) {
      console.log(`returning object for ${item.name}`);
      return item;
    } else {
      console.log(`returning object for ${acc.name}`);
      return acc;
    }
  } // end myFunction
}

console.log(findHighestPaid(employees));

【讨论】:

    【解决方案2】:

    尽管您根本不需要Math.sign,但您的代码运行良好,只需要return 结果:

    const employees = [
      {
        name: "Aziz",
        salary: 17050,
      },
      {
        name: "Angela",
        salary: 17080,
      },
      {
        name: "Abelard",
        salary: 17070,
      },
    ];
    
    function findHighestPaid(arrayOfObjects) {
      let myObject = {
        name: "pretendEmployee",
        salary: 17040,
      };
    
      return arrayOfObjects.reduce(myFunction, myObject);
    
      function myFunction(acc, item) {
        let personSalary = item.salary;
        let accSalary = acc.salary;
        if (personSalary - accSalary > 0) {
          console.log(`returning object for ${item.name}`);
          return item;
        } else {
          console.log(`returning object for ${acc.name}`);
          return acc;
        }
      } // end myFunction
    }
    
    console.log('Highest paid', findHighestPaid(employees));

    【讨论】:

      【解决方案3】:

      你只需要这样写

      function findHighestPaid(arrayOfObjects) {
          return arrayOfObjects.reduce((prev, curr) => {
              if(!prev) {
                  return curr;
              }
      
              return curr.salary > prev.salary ? curr : prev;    
          }, null);
      }
      
      const highestPaidEmployee = findHighestPaid(employees);
      
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多