作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
像这样考虑数据对象
var data = [
{name: 'abc', dis: 0},
{name: 'bcd', dis: 30},
{name: 'cde', dis: 70},
{name: 'def', dis: 22},
{name: 'efg', dis: 40},
{name: 'fgh', dis: 29},
{name: 'ghi', dis: 41},
{name: 'hij', dis: 33}
];
我只想在累积距离大于或等于 100 时过滤掉对象。因此所需的输出将是
var finalData = [
{name: 'abc', dis: 0}, //start point
{name: 'cde', dis: 100}, // 0 + 30 + 70
{name: 'ghi', dis: 132}, //22 + 40 + 29 + 41
{name: 'hij', dis: 33} // 33 as points ended
];
Offcourse 我可以通过 for-loop 轻松完成并像这样推送
var finalData = [];
var sum = 0;
for(var i=0;i<data.length;i++) {
sum += data[i].dis;
if(i == 0 || sum >= 100) {
finalData.push({name: data[i].name, dis: sum});
sum = 0;
}
}
但想以 Rxjs 风格学习它。
最佳答案
我不确定特定的 RxJS 功能在这种情况下是否有任何帮助。您是指函数式编程吗?
您可以将 .reduce()
方法与累加器一起使用,并对第一个和最后一个元素进行额外测试。
据我所知,您的原始代码只是缺少对最后一个元素的测试。
var data = [
{name: 'abc', dis: 0},
{name: 'bcd', dis: 30},
{name: 'cde', dis: 70},
{name: 'def', dis: 22},
{name: 'efg', dis: 40},
{name: 'fgh', dis: 29},
{name: 'ghi', dis: 41},
{name: 'hij', dis: 33}
];
var sum = 0;
var finalData = data.reduce(function(prv, cur, i) {
if((sum += cur.dis) >= 100 || !i || i == data.length - 1) {
cur.dis = sum;
sum = 0;
prv.push(cur);
}
return prv;
}, []);
console.log(finalData);
如果你想避免使用定义在 .reduce()
方法范围之外的变量,你可以使用可选的 thisArg
参数或一个对象来代替一个简单的数组作为初始值。
我倾向于选择第二个选项,它允许从一开始就显式初始化累加器:
var data = [
{name: 'abc', dis: 0},
{name: 'bcd', dis: 30},
{name: 'cde', dis: 70},
{name: 'def', dis: 22},
{name: 'efg', dis: 40},
{name: 'fgh', dis: 29},
{name: 'ghi', dis: 41},
{name: 'hij', dis: 33}
];
var finalData = data.reduce(function(prv, cur, i) {
if((prv.sum += cur.dis) >= 100 || !i || i == data.length - 1) {
cur.dis = prv.sum;
prv.sum = 0;
prv.res.push(cur);
}
return prv;
}, {sum: 0, res: []}).res;
console.log(finalData);
关于javascript - 根据字段的累计和过滤元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915650/
我对以下需要使用 SQL 查询而不是 plsql 来解决的问题感到困惑。这个想法是建立一个累积列来计算之前的所有月份。输入表看起来像 Month 1 2 3 .. 24 我需要建立下表:
我正在寻找一个整洁的解决方案,最好使用 tidyverse 这个问题符合this answer ,但它确实有一个额外的扭曲。我的数据有一个整体分组变量“grp”。在每个这样的组中,我想根据“试验”定义
我正在尝试在 Spotfire 中创建一个运行余额列,该列应该如下图所示。本质上,我想逐行计算“金额”列的累积总计,并且我希望它随着日期的变化从 0 开始。 我尝试过几个 OVER 函数:Sum([A
我是一名优秀的程序员,十分优秀!