提问者:小点点

可以减少返回一个2个值的数组吗?


所以我尝试做一个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来解决我的错误,因为看起来我只需要将数组缩小到一个更小的数组。


共3个答案

匿名用户

你可以这样做:

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]);