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

时间:2018-11-30 22:21:08

标签: javascript ecmascript-6 ramda.js

我正在尝试使用键作为参考用另一个对象填充

// 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

的东西。

1 个答案:

答案 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>