簡體   English   中英

是否有等同於Ramda的“進化”功能的lodash / fp?

[英]Is there a lodash/fp equivalent of Ramda's 'evolve' function?

尋找與Ramda 的演變相當的破破爛爛的東西

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)
}

我找不到任何內置的等效項。 這是您實現自我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> 

剛剛嘗試使用更多lodash函數:

const evolve = _.curry((transformations, item) =>
    _.mapValues.convert({ cap: false })((value, key) => {
        const transformation = _.propOr(identity, key, transformations);

        return _.cond([
            [_.isFunction, t => t(value)],
            [_.isObject, t => evolve(t, value)],
            [_.T, _.always(value)],
        ])(transformation);
    }, item)
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM