Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在映射和过滤方面,FlatMap与Reduce的比较-是否推荐一种而不是另一种?_Javascript_Arrays - Fatal编程技术网

Javascript 在映射和过滤方面,FlatMap与Reduce的比较-是否推荐一种而不是另一种?

Javascript 在映射和过滤方面,FlatMap与Reduce的比较-是否推荐一种而不是另一种?,javascript,arrays,Javascript,Arrays,根据,当需要对一组对象进行映射和筛选时,尤其是当它们希望避免在集合中多次循环时,建议使用flatMap或reduce。就个人而言,我更喜欢使用flatMap,因为我认为它更容易阅读,但这当然是完全主观的。除了flatMap的浏览器兼容性问题外,一种方法是否普遍推荐或优于另一种方法(可能是因为但不限于性能或可读性的原因) 更新:以下是引用的flatMap过滤答案中的一个示例: var选项=[{ 名称:“一”, 分配:正确 }, { 姓名:"两",, 分配:假 }, { 姓名:"三",, 分配:正

根据,当需要对一组对象进行映射和筛选时,尤其是当它们希望避免在集合中多次循环时,建议使用
flatMap
reduce
。就个人而言,我更喜欢使用
flatMap
,因为我认为它更容易阅读,但这当然是完全主观的。除了
flatMap
的浏览器兼容性问题外,一种方法是否普遍推荐或优于另一种方法(可能是因为但不限于性能或可读性的原因)

更新:以下是引用的flatMap过滤答案中的一个示例:

var选项=[{
名称:“一”,
分配:正确
},
{
姓名:"两",,
分配:假
},
{
姓名:"三",,
分配:正确
},
];
var assignees=options.flatMap((o)=>(o.assigned?[o.name]:[]);
控制台日志(受让人);
document.getElementById(“输出”).innerHTML=JSON.stringify(受让人)
仅指定选项

实际上两者都不是。对于映射和筛选,您应该使用
map
filter

var assignees = options.filter(o => o.assigned).map(o => o.name);
更简单、更可读,它直接表达了您的意图。没有什么比这更清楚了


如果您关心性能,请始终进行基准测试以查看对您的实际案例的实际影响,但不要过早地进行优化。

在这种情况下,我会使用reduce

var选项=[{
名称:“一”,
分配:正确
},
{
姓名:"两",,
分配:假
},
{
姓名:"三",,
分配:正确
},
];
var受让人=选项。减少((结果,项目)=>{
如果(分配的项目){
结果.推送(项目.名称);
}
返回结果;
}, []);

控制台日志(受让人)如果我的问题有问题,请告诉我,我将尝试解决它。没有任何上下文的向下投票不能帮助我回答我的问题。你不能用flatMap过滤任何东西。flatmap与map后跟flat相同。在大多数情况下不建议使用Reduce,因为它很难读取。@Konowy实际上您可以使用flatMap进行过滤。我用一个例子来更新我的问题。我没有看到这个例子。我在写作的时候就被打断了。现在添加了@KonradLinkowskiA filter,后跟一个映射,应该在一次迭代中使用reduce来完成,而不是两次迭代。@AdrianBrand如果您只关心一次迭代,则应该使用迭代器来完成,但我怀疑在大多数情况下性能问题。如果你知道它有副作用,你无论如何都会做一个基准测试,并且可能会使用一个简单的循环,而不是一些带有副作用的
reduce
。@AdrianBrand在你答案中的代码中,
push
可能是一个副作用。我建议不要将其与函数方法混用,它可能不会从
reduce
调用中流出,但它确实会从回调函数中流出,这会使调用变得不纯。我认为与
const assignees=[]相比,绝对没有任何好处;对于(const item of options)如果(item.assigned)受让人推送(item)@LockettKs但为什么?它没有什么问题,尤其是当阵列很小或过滤器具有很高的选择性时。或者使用polyfill并写入
options.values().filter(o=>o.assigned).map(o=>o.name).toArray()
var assignees=options.reduce((结果,项)=>([…结果,项]),[])
-更实用的方法我在对累加器进行性能测试之前一直使用累加器上的排列,对于阵列和对象,它大约差3个数量级。速度慢了1000多倍。我仍然使用spread来创建新对象,但避免使用它。