根据字段的累积和筛选元素
Filtering elements based on accumulated sum of a field
考虑这样的数据对象
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
];
当然我也可以通过for循环和push来实现,就像这样
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功能在这种情况下是否会有任何帮助。你是说函数式编程吗?
您可以将.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);
相关文章:
- 如何从另一个带下划线的数组中筛选带元素的数组
- 已筛选jQuery集中元素的索引
- JQuery获取最接近的元素并筛选子元素
- getElementsByTagName排除元素(筛选器)
- 根据单击的筛选器选项和容器元素值中的匹配值筛选元素
- 使用 “each” 元素使用 JQuery 筛选表
- 筛选具有特定类作为祖先的元素
- 根据文本内容从jquery对象中筛选元素
- 使用IE筛选器时不应用悬停样式,并且无法单击元素
- 使用用户输入的维度,根据每个元素中的字符数筛选数组
- 如何在Javascript或Undercore中以数组元素列表为键筛选对象
- JQuery:筛选列表元素
- 查找按类筛选的元素的上一个匹配项
- 带有li元素的复选框筛选器
- JQuery没有't更新:动态添加元素的最后一个筛选器
- 按筛选的子文档数组元素计数排序
- 根据两个其他值之间的属性值筛选元素
- 根据字段的累积和筛选元素
- 按tagName筛选元素
- 使用javascript从html列表中筛选元素