Javascript reduce函数

Javascript reduce函数,javascript,arrays,Javascript,Arrays,您好,我有一个数组,如下所示: [[1,1],[2,8],[3,12],[4,13],[5,23],[6,30],[7,41],[8,44],[9,50]] [[1,1],[2,8],[3,0],[4,1],[5,11],[6,0],[7,11],[8,14],[9,0]] 假设它是[[x,y]]的格式 正如上面的数组所示,内部数组中的第一个元素从1,2…6开始,即x,内部数组的第二个元素是1,8,12,13,23和30,即y。 这是一个y的累积数组,我想把它转换成非累积数组,但有一个扭曲

您好,我有一个数组,如下所示:

[[1,1],[2,8],[3,12],[4,13],[5,23],[6,30],[7,41],[8,44],[9,50]]
[[1,1],[2,8],[3,0],[4,1],[5,11],[6,0],[7,11],[8,14],[9,0]]
假设它是[[x,y]]的格式

正如上面的数组所示,内部数组中的第一个元素从1,2…6开始,即x,内部数组的第二个元素是1,8,12,13,23和30,即y。 这是一个y的累积数组,我想把它转换成非累积数组,但有一个扭曲

我想通过在x的最后三个值处获得y值的差值,将y转换为非累积数组

因此,我希望最终结果如下:

[[1,1],[2,8],[3,12],[4,13],[5,23],[6,30],[7,41],[8,44],[9,50]]
[[1,1],[2,8],[3,0],[4,1],[5,11],[6,0],[7,11],[8,14],[9,0]]
我在这里试过小提琴:

到目前为止,我已经能够通过Dekel stackoverflow guy的帮助获得两个数组元素之间的差异,正如您在上面的小提琴中所看到的:

$document.readyfunction{ var old_arr=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; var new_arr=old_arr.reducefunctiona,b,c,d{ 如果a.长度{ a、 按[d[c][0],d[c][1]-d[c-1][1]] }否则{ a=[b] } 返回a; }, []; console.lognew_arr; }; 为什么要减少?一个简单的循环可以很好地完成这项工作:

设a=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; 放出=[], n=0, lastY=0; 对于a的let[x,y]{ 如果++n%3==0 lastY=y; 向外推[x,y-整形]; } console.logJSON.stringifyout为什么要减少?一个简单的循环可以很好地完成这项工作:

设a=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; 放出=[], n=0, lastY=0; 对于a的let[x,y]{ 如果++n%3==0 lastY=y; 向外推[x,y-整形]; } console.logJSON.stringifyout使用reduce,您还可以使用ES6箭头函数和扩展运算符这样做:

var arr=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; var result=arr.reduce[arr,v],[x,y],i=> [[…arr[x,i%3==2?0:y-v]],i%3==2?y:v],[],0][0]; console.logresult 使用reduce,您也可以使用ES6箭头功能和扩展运算符执行此操作:

var arr=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; var result=arr.reduce[arr,v],[x,y],i=> [[…arr[x,i%3==2?0:y-v]],i%3==2?y:v],[],0][0];
console.logresult 使用reduce可以做到这一点——您只需要确定何时将每三个值归零,以及何时找到当前值与前三个值之间的差值

使用更易懂的名称命名参数也有帮助

var old_arr=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; var new_arr=old_arr.reduceFunction结果、值、索引、arr{ 如果索引%3==2{ 返回结果。concat[[value[0],0]];//将每三个值设置为0。 }否则{ var prevIndex=指数-指数%3-1; var-prevVal=prevIndex>-1?arr[prevIndex][1]:0; 返回result.concat[[value[0],Math.abspreval-value[1]]; } }, [];
console.logJSON.stringifynew\u arr;//[1,1],[2,8],[3,0],[4,1],[5,10],[6,0],[7,11],[8,3],[9,0]。使用reduce可以做到这一点-您只需确定何时将每三个值归零,以及何时找到当前值与之前的三个值之间的差异

使用更易懂的名称命名参数也有帮助

var old_arr=[[1,1]、[2,8]、[3,12]、[4,13]、[5,23]、[6,30]、[7,41]、[8,44]、[9,50]; var new_arr=old_arr.reduceFunction结果、值、索引、arr{ 如果索引%3==2{ 返回结果。concat[[value[0],0]];//将每三个值设置为0。 }否则{ var prevIndex=指数-指数%3-1; var-prevVal=prevIndex>-1?arr[prevIndex][1]:0; 返回result.concat[[value[0],Math.abspreval-value[1]]; } }, []; console.logJSON.stringifynew\u arr;//您可以使用[1,1]、[2,8]、[3,0]、[4,1]、[5,10]、[6,0]、[7,11]、[8,3]、[9,0],它只返回一个带有结果的数组

var数组=[[1,1],[2,8],[3,12],[4,13],[5,23],[6,30],[7,41],[8,44],[9,50], 结果=array.mapfunction a,i{ i+1%3 | | this.last=a[1]; 返回[a[0],a[1]-此.last]; },{last:0}; console.logresult; .作为控制台包装{max height:100%!important;top:0;}您可以使用,它只返回一个带有结果的数组

var数组=[[1,1],[2,8],[3,12],[4,13],[5,23],[6,30],[7,41],[8,44],[9,50], 结果=array.mapfunction a,i{ i+1%3 | | this.last=a[1]; 返回[a[0],a[1]-此.last]; },{last:0}; console.logresult;
.作为控制台包装{最大高度:100%!重要;顶部:0;}为什么y是累积的?我没有得到初始数组和结果之间的逻辑。第一个数组是数组。第二,你试过c+1%3==0吗?@Rajesh它给了我[[8,44],[9,6]]@Weedoze:它来自后端,我想在javascript50-44中计算位置9为6。这是什么逻辑
不应该是0?我还是不明白每3次是什么意思为什么y是累积的?我没有得到初始数组和结果之间的逻辑。第一个数组是数组。第二,你试过c+1%3==0吗?@Rajesh它给了我[[8,44],[9,6]]@Weedoze:它来自后端,我想在javascript50-44中计算位置9为6。根据什么逻辑应该是0?我仍然不明白每3次是什么意思,因为你似乎是唯一一个理解逻辑的人,你能把它添加到你的答案中,这样每个人都能正确理解问题和答案吗?因为我认为reduce会更快?reduce从定义上讲不是更快的-尽管它可以。使用reduce的原因通常与您喜欢的编码风格有关,而函数式编程上瘾者喜欢它。但是,如果您想提高速度,那么for循环的性能通常不会得到轻微的提高。@user1735921:reduce速度较慢,并且严重影响了可读性。没有理由在这里使用它。因为你似乎是唯一一个理解逻辑的人,请你将它添加到你的答案中,这样每个人都能正确理解问题和答案?因为我认为reduce会更快?reduce从定义上讲并不是更快的-尽管它可以。使用reduce的原因通常与您喜欢的编码风格有关,而函数式编程上瘾者喜欢它。但是,如果您想提高速度,那么for循环的性能通常不会得到轻微的提高。@user1735921:reduce速度较慢,并且严重影响了可读性。没有理由在这里使用它。很好的解决方案,很好地使用了逗号运算符@NinaScholz@特林科特,看起来有点傻;我从未见过。作为控制台包装器,很高兴知道:+1无论如何,您的第一个解决方案在ExecJS中成功编译。非常感谢。很好的解决方案,很好地使用了逗号运算符@NinaScholz@特林科特,看起来有点傻;我从未见过。作为控制台包装器,很高兴知道:+1无论如何,您的第一个解决方案在ExecJS中成功编译。谢谢。