假设我需要将数组转换为对象,并在此过程中进行一些过滤。
我有两种方法,一种是可链接的函数方法,例如 .map
、.filter
和 .reduce
,另一种是循环带有老式for循环
的数组并改变一个对象。
功能方式:
const output = fields
.filter(field => field.required)
.map(field => field.name)
.reduce((acc, cur, i) => {
acc[cur] = false;
return acc;
}, {});
老派for循环
方式:
let output2 = {};
for (var i = 0; i < fields.length; i++) {
if (fields[i].required) {
output2[fields[i].name] = false;
}
}
我更喜欢函数式方法,因为我认为它可以带来更好的可读代码。然而,我很惊讶(也有点失望)地发现,函数式方法始终比非函数式、老式的 for-loop
转换方式慢。请查找the JSBench here .
我认为这里可能有几个问题:
- 我是个白痴,我的实现有缺陷但可以优化。
- “JSBench 不是衡量性能的最佳方法。工具 X、Y、Z 是衡量性能的更好方法”
- “函数式方法的性能损失是值得的,因为您可以使用
const
,它具有其他有益的方面,例如(半)不变性。”
有人愿意称重吗?
您可以在 JSBench 链接中找到我正在使用的测试数组。
最佳答案
“过滤映射减少”循环同一数组 3 次。 所以一个 for 循环总是更快。 但减少它本身的效果就很好
const output = fields
.reduce((acc, cur, i) => {
if(cur.required){
acc[cur.name] = false;
}
return acc;
}, {});
关于javascript - 数组过滤和对象转换: what is fastest and what other considerations matter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370419/