如何使用 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))
如何获得奇数之和,即使使用 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))