所以我尝试做一个js挑战,我必须将x数组的索引0中的偶数索引和x数组的索引1中的奇数索引相加,我使用了map,但我感觉它可能更好,因为我使用了一个外部数组返回,而map已经返回了一个新数组,我的解决方案:
// write code here.
const sumOfArr = [0, 0];
array.map((num, i) => {
return i % 2 === 0 ? sumOfArr[0] += num : sumOfArr[1] += num
});
return sumOfArr
}
const nums = [50, 60, 60, 45, 70];
const result = alternatingSums(nums);
console.log("result: ", result);
expect(result).toEqual([180, 105]);
我也试过用reduce,但它总是返回nan:
return array.reduce((acc, num, i) => {
console.log(acc, '---', num, '---', i)
return i % 2 === 0 ? acc[0] = acc[0] + num : acc[1] = acc[1] num
}, [0, 0]);
我花了整个上午的时间来尝试用reduce来解决我的错误,因为看起来我只需要将数组缩小到一个更小的数组。
你可以这样做:
null
function alternatingSums(arr) {
return arr.reduce((acc, n, i) => {
acc[i % 2] += n;
return acc;
}, [0, 0]);
}
const nums = [50, 60, 60, 45, 70];
const result = alternatingSums(nums);
console.log("result: ", result); // [180, 105]
您需要归还累加器
null
function alternatingSums(array) {
return array.reduce((acc, num, i) => {
i % 2 === 0 ? acc[0] = acc[0] + num : acc[1] = acc[1] + num; // changed here
return acc; // changed here
}, [0, 0]);
}
const nums = [50, 60, 60, 45, 70];
const result = alternatingSums(nums);
console.log("result: ", result);
你的主要问题是:
return i % 2 === 0 ? acc[0] = acc[0] + num : acc[1] = acc[1] num
在第一次迭代时,它将返回一个数字,而不是数组,因为acc[0]=acc[0]+num
将返回赋值(即:赋值运算符=
右侧的任何值),在本例中为acc[0]+num
(在另一例中为acc[1]+num
)。 这会导致后续调用acc[0]
和acc[1]
,从而给出undefined
,因为数字没有这样的属性。
相反,您需要每次返回一个修改过的数组。 一种可能的方法是在reduce回调中破坏累加器的数组,然后添加return新数组,其中包含修改后的组件:
null
function alternatingSums(array) {
return array.reduce(([even, odd], num, i) => {
return i % 2 === 0 ? [even+num, odd] : [even, odd+num];
}, [0, 0]);
}
const nums = [50, 60, 60, 45, 70];
const result = alternatingSums(nums);
console.log(result); // [180, 105]);