gpt4 book ai didi

Javascript - 为什么 Ramda over 函数在这里不起作用?

转载 作者:行者123 更新时间:2023-12-03 00:38:14 26 4
gpt4 key购买 nike

我正在尝试使用键作为引用来用另一个对象填充一个对象。

// Object with actual information
{
'key1.key2.key3': {},
'key1.key4': {},
}

// Desired Shape

{
'key1': {
'key2': {
'key3': {
},
},
'key4': {
},
}

使用Ramda库这应该是小菜一碟,同时,我成功地用所需的形状填充了累加器,我遇到了这不是我期望的行为方式。

const fillShapeWithParsed = shape =>
R.pipe(
R.toPairs,
R.reduce(
(accumulator, [shapeKey, complexValue]) => {
return R.over(
R.lensPath(shapeKey.split('.').filter(key => key !== '')),
R.merge(complexValue),
accumulator
);
},
shape
)
);

上面代码的输出是:如果带有 info 的对象中引用键的值是一个对象数组,则累加器接收转换为以索引为键的嵌套对象的值。

// Object with information
{
'key1.key2.key3': [
{},
{},
{},
],
}

// Desired Shape

{
'key1': {
'key2': {
'key3': {
'0': {},
'1': {},
'2': {},
},
},
},
}

此时我知道这是由 R.merge() 完成的功能...

所以我将其更改为 R.clone() ,它向我抛出了一个关于参数不是函数的错误。

除此之外,现在合并函数已被弃用,我想将其替换为可以帮助我不转换complexValue的东西

最佳答案

其实你离这个目标并不遥远。我认为您缺少的只是检查 complexValue 是否是一个数组。如果是,则按原样返回它 (R.always),否则将其与 accumulator 合并。

此外,我已将 R.pipe 直接分配给 fillShapeWithParsed

const input = {
'key1.key2.key3': {},
'key1.key4': {},
'key1.key4.key5': [
{},
{},
{},
],
};

const fillShapeWithParsed = R.pipe(
R.toPairs,
R.reduce(
(accumulator, [shapeKey, complexValue]) => {
return R.over(
R.lensPath(shapeKey.split('.').filter(key => key !== '')),
R.is(Array, complexValue) ? R.always(complexValue) : R.merge(complexValue),
accumulator
);
}, {})
);

console.log(

fillShapeWithParsed(input)

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>

关于Javascript - 为什么 Ramda over 函数在这里不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565693/

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