2017-04-18 44 views
0

在有很多我的代码做这样的事情:循环访问数组并创建一个新值的方法最短?

return routes.map(route => processValue(route.someProperty)); 

要快速返回一个新的数组只用处理过的数据,我需要。然而,在目前的形式下,如果您不返回任何内容,那么新数组的索引值将为undefined,其中map()运行原始数组元素上的函数。

我想知道是否有类似的,快速的方式来实现一些与.map()filter()混合的东西,其中新的数组只有从回调函数返回的元素?

+0

可能的重复(S):http://stackoverflow.com/questions/19520662/how-通过循环在javascript中去除数组中的多个项目http://stackoverflow.com/questions/40439015/javascript-filter-array-of-objects-based-on-property-values –

+0

*“其中新数组只有从回调函数返回的元素”* - >' routes.filter(route => route.someProperty === processValue(route.someProperty));'当然,如果“元素”不是简单的值就会失败。 –

回答

0

您可以使用.reduce

return routes.reduce((acc, route) => { 
    const value = processValue(route.someProperty); 
    if (value !== undefined) acc.push(value); 
    return acc; 
}, []); 

甚至更​​小,只要processValue不返回数组:

return routes.reduce((acc, route) => acc.concat(processValue(route.someProperty) || [], []); 

个人而言,我喜欢.map().filter但正如

return routes 
    .map((route) => processValue(route.someProperty)) 
    .filter(Boolean); 
+0

我真的应该把'reduce()'文档看得更长一些,我乍一看完全误解了它。 'reduce'的简写形式有点混乱,但都很酷。谢谢! :) – styke

+0

对于使用reduce和say,for循环同时将值推送到预定义的var之间的性能差异,您有任何想法吗? – styke

+0

我个人更喜欢过滤方法,更干净。 –