如何解决在Javascript中查找两个杠杆数组对象的平均值
我正在使用 for 循环的两级数组找到未锁定项目的平均值。我只是想知道在 ES6 中这样做是否更好?
let pct_completed = 0;
let total_units_of_module = 0;
const topics = _.topics || [];
for(let topic of topics) {
const units = topic.units ||[];
total_units_of_module += units.length;
for (let unit of units) {
if (!unit.lock) pct_completed++;
}
}
pct_completed = Math.floor(pct_completed / total_units_of_module * 100);
我们可以使用 reduce
函数计算吗?
解决方法
虽然可能不是性能最好的,也没有使用 reduce,但我们至少可以让代码更清晰:
- 我们要计算单位
- 我们要计算解锁的单位
const units = topics.flatMap(topic => topic.units || [])
const unlockedUnits = units.filter(u => !u.lock)
const pct_completed = units.length
? Math.floor(unlockedUnits.length / units.length * 100)
: 100
,
在外部数组上使用 reduce
是可能的,但我真的不推荐它:
const { pct_completed,total_units_of_module } = topics.reduce((a,topic) => {
const units = topic.units || [];
a.total_units_of_module += units.length;
for (let unit of units) {
if (!unit.lock) a.pct_completed++;
}
return a;
},{ pct_completed: 0,total_units_of_module: 0 });
pct_completed = Math.floor(pct_completed / total_units_of_module * 100);
IMO 更好的方法是找出有多少未锁定的单位,然后一次性添加它们,而不是单独增加。 pct_completed
在迭代期间也不是一个好的变量名,因为它代表解锁计数,而不是完成的百分比:
let unlockCount = 0;
let total_units_of_module = 0;
for (const topic of _.topics || []) {
const units = topic.units || [];
total_units_of_module += units.length;
unlockCount += units.filter(unit => !unit.lock).length;
}
const pct_completed = Math.floor(unlockCount / total_units_of_module * 100);
您可以使用.reduce
来计算添加到unlockCount
的数量,但看起来有点混乱,IMO不值得:
unlockCount += units.reduce((a,unit) => a + !unit.lock,0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。