Javascript 使用Ramda在映射数组中增加数字

Javascript 使用Ramda在映射数组中增加数字,javascript,ramda.js,Javascript,Ramda.js,我有一个如下所示的数组: [{location: {…}, distance: 0} {location: {…}, distance: 0} {location: {…}, distance: 0.37348441209694133} {location: {…}, distance: 0} {location: {…}, distance: 0.4229382782128456} {location: {…}, distance: 0} {location: {…}, distance: 0

我有一个如下所示的数组:

[{location: {…}, distance: 0}
{location: {…}, distance: 0}
{location: {…}, distance: 0.37348441209694133}
{location: {…}, distance: 0}
{location: {…}, distance: 0.4229382782128456}
{location: {…}, distance: 0}
{location: {…}, distance: 0.006098292961396555}
{location: {…}, distance: 0}
{location: {…}, distance: 0.07885846317546494}]
我想映射一个新数组,其距离值比上一个值增加。因此,在上面的示例中,最后一个距离值将是0.88137944644665,因为它在迭代所有对象时已添加了所有值


在Ramda.js中,我尝试在映射数组时添加上一个距离值,但由于该值未定义,因此无效。我也研究过reduce,但没有成功。关于如何在Ramda.js中实现这一点,你有什么想法吗?

尽管我非常喜欢Ramda,但在这里你不需要它:

arr.map(({ location, distance }) => ({ location, distance: distance + 1 }));
要分解这一点:

arr // your array of objects
  .map( // call to Array.prototype.map
    ({ location, distance }, i, arr) => // function params, destructures
      ({ location, distance: distance + 1 })); // return new object same loc, incremented distance
编辑 由于我错过了有关聚合的部分,请改用reduce:

arr.reduce((aggregate, { location, distance }, i) => {
  const dist = i ? aggregate[i - 1].distance : 0;
  aggregate.push({ location, distance: distance + dist });
  return aggregate;
}, []);  
试试下面的方法

const reducedData = data.reduce( (prev, val) => {
  prev.sum += val.distance
  prev.datas.push({
    ...val,
    distance: prev.sum
  })
  return prev;
}, {sum: 0, datas: []})
.reduce
循环数据,并将每一行合并到
prev
中。这个脚本的最终输出是一个对象,看起来像
{sum:number,datas:[…]}
sum
这里是总距离,
datas
将包含您想要的数组


请参阅快照:

如果您正在查看此处使用Ramda功能,可以提供帮助。此函数与
reduce
非常相似,但它不会返回单个摘要值,而是生成每个后续结果的列表

const distanceL=R.lensProp(“距离”)
const addDistance=R.compose(R.add,R.prop('distance'))
常数fn=数据=>
右扫(
(acc,next)=>R.over(距离,添加距离(acc),next),
数据[0],
R.tail(数据)
)
console.log(fn([
{位置:{},距离:0},
{位置:{},距离:0},
{位置:{},距离:0.37348441209694133},
{位置:{},距离:0},
{位置:{},距离:0.4229382782128456},
{位置:{},距离:0},
{位置:{},距离:0.006098292961396555},
{位置:{},距离:0},
{位置:{},距离:0.07885846317546494}
]))
或者您可以使用:

const{lift,scan,head,tail}=R
常数xs=[
{位置:{id:1},距离:0},
{位置:{id:2},距离:0},
{位置:{id:3},距离:0.37348441209694133},
{位置:{id:4},距离:0},
{位置:{id:5},距离:0.4229382782128456},
{位置:{id:6},距离:0},
{位置:{id:7},距离:0.006098292961396555},
{位置:{id:8},距离:0},
{位置:{id:9},距离:0.07885846317546494}
]
常量accumDist=提升(扫描((累计,x)=>({…x,距离:x.distance+agg.distance}))(头部,尾部)
console.log(accumDist(xs))

他想要聚合距离,你的解决方案只会在尝试时将距离增加1 hanks,但asosnovsky是对的,我想要聚合距离。@londonfed fixed。哦,看,@ScottChristopher比我快了一步。这已经够不一样的了,反正我都会留着的。