作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个列表如下:
let scores = [{name: "A", skills: 50, result: 80},
{name: "B", skills: 40, result: 90},
{name: "C", skills: 60, result: 60},
{name: "D", skills: 60, result: 70}];
我想过滤在 typescript 中使用 Map-Reduce 获得最大技能值的列表。
output = [{name: "C", skills: 60, result: 60},
{name: "D", skills: 60, result: 70}];
我尝试了如下并得到了预期的输出:
let scores = [{name: "A", skills: 50, result: 80},
{name: "B", skills: 40, result: 90},
{name: "C", skills: 60, result: 60},
{name: "D", skills: 60, result: 70}];
let maxSkillValue = Math.max.apply(Math, scores.map(function (o) { return o.skills; }));
let output = scores.filter(i => i.skills === maxSkillValue);
console.log(output);
使用Map-Reduce寻找答案。
最佳答案
您可以通过检查结果集或最后存储的最大技能值来减少数组,然后将此对象作为数组中的新结果集。否则检查技能是否相等,然后压入实际值并返回累加器。
要从一定数量的属性中获取最大对象,您可以存储每个属性的最大值并过滤部分结果集。
let scores = [{ name: "A", skills: 50, result: 80 }, { name: "B", skills: 40, result: 90 }, { name: "C", skills: 60, result: 60 }, { name: "D", skills: 60, result: 70 }],
maxSkills = scores.reduce((r, o) => {
if (!r || r[0].skills < o.skills) return [o];
if (r[0].skills === o.skills) r.push(o);
return r;
}, undefined),
keys = ['skills', 'result'],
max = scores.reduce((r, o) => {
keys.forEach(k => r[k] = Math.max(k in r ? r[k] : -Infinity, o[k]));
r._ = [...r._, o].filter(q => keys.some(k => r[k] === q[k]));
return r;
}, { _: [] })._;
console.log(maxSkills);
console.log(max);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 如何在 typescript 中使用map-reduce过滤具有最大值属性的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307117/
我是一名优秀的程序员,十分优秀!