Javascript 数组过滤和对象转换:什么是最快的,还有什么其他考虑事项?
假设我需要将一个数组转换成一个对象,并在此过程中进行一些过滤 我有两种方法,一种是使用可链接的函数方法,如Javascript 数组过滤和对象转换:什么是最快的,还有什么其他考虑事项?,javascript,arrays,performance,Javascript,Arrays,Performance,假设我需要将一个数组转换成一个对象,并在此过程中进行一些过滤 我有两种方法,一种是使用可链接的函数方法,如.map、.filter和.reduce,另一种是使用老式的for loop在数组上循环并变异对象 功能方式: const output = fields .filter(field => field.required) .map(field => field.name) .reduce((acc, cur, i) => { acc[cu
.map
、.filter
和.reduce
,另一种是使用老式的for loop
在数组上循环并变异对象
功能方式:
const output = fields
.filter(field => field.required)
.map(field => field.name)
.reduce((acc, cur, i) => {
acc[cur] = false;
return acc;
}, {});
let output2 = {};
for (var i = 0; i < fields.length; i++) {
if (fields[i].required) {
output2[fields[i].name] = false;
}
}
老派for loop
方式:
const output = fields
.filter(field => field.required)
.map(field => field.name)
.reduce((acc, cur, i) => {
acc[cur] = false;
return acc;
}, {});
let output2 = {};
for (var i = 0; i < fields.length; i++) {
if (fields[i].required) {
output2[fields[i].name] = false;
}
}
let output2={};
对于(变量i=0;i
我更喜欢函数式方法,因为我认为它能带来更好的可读性代码。然而,我很惊讶(也有点失望)地了解到,功能性方法始终比非功能性的、老式的for loop
转换方法慢。请找到
我想这里可能有几件事:
const
,它还有其他有益的方面,如(半)不变性。”您可以在JSBench链接中找到我正在使用的测试阵列。另一种功能方式,可能快三倍:
const output = fields
.reduce((acc, cur) => {
if(curr.required) acc[cur.name] = false;
return acc;
}, {});
您还可以使用映射(以后性能会更好):
“filter map reduce”循环是同一数组的3倍。
所以一个for循环总是更快。
但减少其本身的工作很好
const output = fields
.reduce((acc, cur, i) => {
if(cur.required){
acc[cur.name] = false;
}
return acc;
}, {});
<>你可以考虑使用与./P>结合使用。
不,一些重复调用的函数将永远不会击败for循环。注意,第一个迭代3次,第二个迭代一次。我认为lodash chains可以写第一个,但实际上可以写第二个(不完全是舒尔)@Jonasw嗯,实际上。。。功能性方法似乎可以更快。不过我注意到有点奇怪:使用3种方法的JSBench比只使用优化的函数和for循环方法的JSBench提供了更好的优化函数实现结果。三个实现:两个实现:@pablo可能有一些很好的内联……正如我所怀疑的,我确实是个白痴。当然,这是一个更好的方法。根据JSBench的说法,这种实现非常接近于
for loop
方法:100%对99%,并且在大多数运行中都取得了胜利。我喜欢这种方法,非常干净。但是在一对一的for loop
中,for loop
获胜:这只是一个给你更多可能性的想法。谢谢你,非常感谢@nina:)