为了账号安全,请及时绑定邮箱和手机立即绑定

有没有更好的方法在 JavaScript 中对数组项进行部分求和?

有没有更好的方法在 JavaScript 中对数组项进行部分求和?

明月笑刀无情 2021-06-18 17:02:55
我想知道是否有更好的方法来为数组的部分总和生成性能更好的解决方案。给定一个数组 say x = [ 0, 1, 2, 3, 4, 5 ],我生成了项目的子数组,然后计算了每个数组的总和,它给出:[ 0, 1, 3, 6, 10, 15 ]所以完整的代码是:x.map((y,i)=>x.filter((t,j)=>j<=i))  .map(ii=>ii.reduce((x,y)=>x+y,0))我想知道平面地图或其他一些数组方法是否有不需要扩展每个子数组的解决方案。
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

很多,通过保持运行总数:


function* partialSums(iterable) {

    let s = 0;


    for (const x of iterable) {

        s += x;

        yield s;

    }

}


const x = [0, 1, 2, 3, 4, 5];

console.log(Array.from(partialSums(x)).join(', '));

线性时间,在线。(您也可以直接生成数组;在下面展开。)


const partialSums = arr => {

    let s = 0;

    return arr.map(x => s += x);

};


const x = [0, 1, 2, 3, 4, 5];

console.log(partialSums(x).join(', '));


查看完整回答
反对 回复 2021-06-24
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

平面地图在您的情况下没有用,因为您不会试图将作为列表出现的部分结果展平,但我们可能会尝试在单个reduce 中解决您的问题:


[0, 1, 2, 3, 4, 5]

.reduce(

   ([arr, sum], el) => { // We pass along array and running sum

       const next = sum + el

       return [[...arr, next], next]

   },

   [[], 0] // We need to seed our reduce with empty array and accumulator for calculating running sum

)[0] // Array containing array and the last sum is returned, so we need to take only the first element

它还只迭代数组一次,因此与创建切片然后对它们求和的解决方案相比,它的性能可能更高一些。


或者带有 的版本array.push,它重用相同的数组:


[0, 1, 2, 3, 4, 5]

.reduce(

   ([arr, sum], el) => { // We pass along array and running sum

       const next = sum + el

       arr.push(next)

       return [arr, next]

   },

   [[], 0] // We need to seed our reduce with empty array and accumulator for calculating running sum

)[0] 


查看完整回答
反对 回复 2021-06-24
  • 3 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信