考虑像这样的数据对象
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风格学习它。
答案 0 :(得分:2)
我不确定具体的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);
&#13;
如果要避免使用在.reduce()
方法范围之外定义的变量,可以使用可选的thisArg
参数或对象而不是简单数组作为初始值。 / p>
我倾向于选择允许从头开始显式初始化累加器的第二个选项:
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);
&#13;