我正在尝试使用键作为参考用另一个对象填充
。// 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
的东西。答案 0 :(得分:1)
您实际上相距不远。我想您所缺少的只是检查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>