如何使用 Array.reduce 方法求奇偶数之和?

how to get sum of odd, even numbers using Array.reduce method?

如何获得奇数之和,即使使用 reduce 方法,我已经按照下面的代码完成但返回 undefined ,@js-beginner

//下面的代码

nums= [1,2,3,4,5,6,7,8,9]

function getOddEvenSum(numbers){     
    let{even,odd} = numbers.reduce((acc, cuu) => cuu%2 === 0?acc.even + cuu:acc.odd+cuu,{even:0, odd:0})

    return {even, odd}
  }

console.log(getOddEvenSum(nums)

//输出低于

{even:undefined, odd:undefined}

您可以这样使用 Array.prototype.reduce

const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];

const [odds, evens] = nums.reduce(
  ([odds, evens], cur) =>
    cur % 2 === 0 ? [odds, evens + cur] : [odds + cur, evens],
  [0, 0]
);

console.log(odds);
console.log(evens);

您从 reduce 回调中 return 得到的值将是数字数组的下一个 invocation/iteration 上的 acc 的值。目前,您的 acc 开始时是一个对象,但由于您只是从第一次迭代中 return 获取一个数字,因此所有后续迭代都将使用一个数字作为 acc,这不会没有 .even.odd 属性。您可以 return 一个具有更新的 even/odd 属性的新对象,以便 acc 在所有迭代中保持为一个对象:

const nums = [1,2,3,4,5,6,7,8,9];

function getOddEven(numbers){     
  return numbers.reduce((acc, cuu) => cuu % 2 === 0
    ? {odd: acc.odd, even: acc.even + cuu}
    : {even: acc.even, odd: acc.odd+cuu},
  {even:0, odd:0});
}

console.log(getOddEven(nums));

这不是 reduce 语法的工作原理。一种可能的实现方式:

function getOddEven(nums) {
  return nums.reduce(
    ({odd, even}, num) => num % 2 === 0 ?
      {odd, even: even + num} :
      {odd: odd + num, even},
    {odd: 0, even: 0},
  );
}

我认为这不是很清楚。由于性能可能并不重要,因此更清晰的替代方案是:

function getOddEven(nums) {
  return {
    odd: nums.filter(num => num % 2 == 1).reduce((acc, num) => acc + num),
    even: nums.filter(num => num % 2 == 0).reduce((acc, num) => acc + num),
  };
}

根据您的代码,您需要return acc

let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    function getOddEven(numbers) {
      let {
        even,
        odd
      } = numbers.reduce((acc, cuu) => {
      
        if(cuu%2 == 0) 
        {
        acc.even += cuu    
        }
        else{
        acc.odd += cuu   
        }
        
        return acc
      
      }, 
      {
        even: 0,
        odd: 0
      })
    
      return {
        even,
        odd
      }
    }
    
    console.log(getOddEven(nums))