根据这个SO线程,当需要映射和筛选对象数组时,建议使用flatMap
或reduce
,尤其是当它们希望避免多次循环遍历集合时。就我个人而言,我更喜欢使用flatMap
,因为我认为它更容易阅读,但这当然完全是主观的。除了flatMap
的浏览器兼容性问题外,一种方法通常是推荐的还是有益的(可能是因为但不限于性能或可读性的原因(?
更新:这是一个来自flatMap过滤参考答案的例子:
var options = [{
name: 'One',
assigned: true
},
{
name: 'Two',
assigned: false
},
{
name: 'Three',
assigned: true
},
];
var assignees = options.flatMap((o) => (o.assigned ? [o.name] : []));
console.log(assignees);
document.getElementById("output").innerHTML = JSON.stringify(assignees);
<h1>Only assigned options</h1>
<pre id="output"> </pre>
实际上两者都不是。对于映射和过滤,您应该使用map
和filter
:
var assignees = options.filter(o => o.assigned).map(o => o.name);
它更简单易读,直接表达了你的意图。没有什么比清晰度更好的了。
如果你关心性能,请始终进行基准测试,以查看对现实世界案例的实际影响,但不要过早优化。
在这种情况下,我会使用reduce。
var options = [{
name: 'One',
assigned: true
},
{
name: 'Two',
assigned: false
},
{
name: 'Three',
assigned: true
},
];
var assignees = options.reduce((results, item) => {
if (item.assigned) {
results.push(item.name);
}
return results;
}, []);
console.log(assignees);