是否有 lodash/fp 相当于 Ramda 的 'evolve' 函数?
Is there a lodash/fp equivalent of Ramda's 'evolve' function?
正在寻找 Ramda's evolve:
的 lodash 等价物
const transformForDisplay = (item) => {
const transform = {
body: truncate({ length: 100 }),
title: truncate({ length: 50 })
}
return R.evolve(transform, item)
}
哪个 returns 对象包含 '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)
);
正在寻找 Ramda's evolve:
的 lodash 等价物const transformForDisplay = (item) => {
const transform = {
body: truncate({ length: 100 }),
title: truncate({ length: 50 })
}
return R.evolve(transform, item)
}
哪个 returns 对象包含 '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)
);