是否有一个lodash / fp相当于Ramda的“进化”功能?

时间:2016-06-29 03:45:37

标签: javascript lodash ramda.js

寻找相当于Ramda's evolve的lodash:

const transformForDisplay = (item) => {
  const transform = {
    body: truncate({ length: 100 }),
    title: truncate({ length: 50 })
  }

  return R.evolve(transform, item)
}

返回包含“item”中所有原始字段的对象,但如果存在,则截断“body”和“title”字段。

编辑:这有效。还有什么比这更精悍的了?

const transformForDisplay = (item) => {
  const transform = {
    body: truncate,
    title: truncate
  }

  const mapValuesWithKey = _.mapValues.convert({ cap: false })
  return mapValuesWithKey((x, key) => transform[key] ? transform[key](x) : x)(item)
}

2 个答案:

答案 0 :(得分:3)

我无法找到任何内置的等价物。以下是您自己实现evolve的方法。

这几乎就是你已经拥有的,除了我使用_.getOr以避免重复transform[key],并且我在必要时添加了对evolve的递归调用。

// Implementation    

const mapValuesWithKey = _.mapValues.convert({cap: false});

function evolve(transformations) {
  return item =>
    mapValuesWithKey((value, key) => {
      const transformation = _.getOr(_.identity)(key)(transformations);
      const type = typeof transformation;
      return type === 'function' ?
        transformation(value) :
        transformation && type === 'object' ?
          evolve(transformation)(value) :
          value;
    })(item);
}

// Example    

const tomato  = {
  firstName: '  Tomato ',
  data: {elapsed: 100, remaining: 1400},
  id: 123
};
const transformations = {
  firstName: _.trim,
  lastName: _.trim, // Will not get invoked.
  data: {elapsed: _.add(1), remaining: _.add(-1)},
  id: null, // Will have no effect.
}
const result = evolve(transformations)(tomato);
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.fp.min.js"></script>

答案 1 :(得分:2)

只需尝试使用更多lodash函数:

edit