2017-05-17 81 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,只使用那些,但這可能是不必要的。