2017-05-17 82 views
4

我有这样的大块javascript代码:数组映射功能

function arrayMapper(mappingFunc) { 
    return items => items.map(mappingFunc); 
} 

function fooTransformer(tem) { 
    return (...); // do something with item and returns a value 
} 

function barTransformer(tem) { 
    return (...); // do something with item and returns a value 
} 

const foosTransformer = arrayMapper(fooTransformer); 
const barsTransformer = arrayMapper(barTransformer); 
(...) 
foosTransformer([1, 2, 3]); 

我在想,如果像我arrayMapper函数将在像lodash本身存在的,只是为了避免重蹈覆辙。

+0

您是否在搜索lodash的文档? – forgivenson

+0

是的,当然,但没有发现任何东西 – Guid

+4

重新发明轮子?这是一个单线功能!我错过了什么吗? –

回答

0

你可以使用chain的方法,然后你可以添加map多次,并在结束通话value()

var arr = [1, 2, 3]; 
 
var add1 = e => e + 1; 
 
var add2 = e => e + 2; 
 

 
var result = _.chain(arr).map(add1).map(add2).value() 
 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

你也可以使用ES6参数解构和reduce()创建函数,它数组以及您提供的每个函数在该数组上的任意数量的回调函数和调用映射方法。

var arr = [1, 2, 3]; 
 
var add1 = e => e + 1; 
 
var add2 = e => e + 2; 
 

 
function arrayMapper(arr, ...mappingFunc) { 
 
    return mappingFunc.reduce((r, f) => (r = Array.prototype.map.call(r, f), r), arr) 
 
} 
 

 

 
var result = arrayMapper(arr, add1, add2) 
 
console.log(result)

2

什么你基本上做的是currying地图功能(右)。

Lodash允许你做的只是:

const mapper = _.curryRight(_.map); 
 

 
const square = mapper(x => x ** 2); 
 

 
console.log(
 
    square([1, 2, 3]) // [1, 4, 9] 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

话虽这么说,它肯定是矫枉过正,使在整个图书馆对于这样一个小功能。也许如果你使用npm,你可以只使用npm install lodash.curryright lodash.map,只使用那些,但这可能是不必要的。