gpt4 book ai didi

javascript - 我怎样才能用 Ramda 深度映射对象

转载 作者:行者123 更新时间:2023-11-30 14:17:48 32 4
gpt4 key购买 nike

我正在尝试查找所有“模板值”,例如{ template: 'Date: <now>'}使用 map 函数来获得这个基本行为:

deepMap(mapFn, {a: 1, b: { c: 2, d: { template: 'Date: <now>'}}})

>> {a: 1, b: { c: 2, d: 'Date: 13423234232'}}

这就是我目前所拥有的。模板对象的插值确实发生了,但它不会替换值。

const obj = {a: 1, b: { c: 2, d: { template: 'Date: <now>'}}};

const deepMap = (fn, xs) =>
mapObjIndexed(
(val, key, obj) =>
or(is(Array, val), is(Object, val))
? deepMap(fn, fn(val))
: fn(val),
xs
);

const checkFn = ({ template }) => template;
const transformFn = (val, key) => {
const interpolated = val.template.replace('<now>', Date.now())
console.log(interpolated);
return interpolated;
};

const mapFn = n =>
checkFn(n)
? transformFn(n)
: n;
console.clear();
deepMap(mapFn, obj);

>> {"a": 1, "b": {"c": 2, "d": {}}}

最佳答案

问题是您正在调用 deepMap再次在映射值上 - 但映射值不再是对象,而是字符串。

or(is(Array, val), is(Object, val))
? deepMap(fn, fn(val))
: fn(val),

如果 val 是 { template: 'Date: <now>'} , val 是一个对象并且可以被深度映射,但是 fn(val)是一个字符串("Date: 123123123"),应该简单地返回。一种解决方案是制作 is检查映射值,而不是原始值:

(val, key) => {
const mappedVal = fn(val);
return or(is(Array, mappedVal), is(Object, mappedVal))
? deepMap(fn, mappedVal)
: mappedVal;
},

另一种可能性是检查 map-function 是否返回了原始值之外的其他内容,并且在这种情况下不要递归。

关于javascript - 我怎样才能用 Ramda 深度映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53265488/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com