lodash中的数组映射函数

时间:2017-05-17 16:05:34

标签: javascript arrays lodash

我有一大堆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一样本地存在,只是为了避免重新发明轮子。

2 个答案:

答案 0 :(得分: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只使用那些但仍然可能没必要的那些。

答案 1 :(得分: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)