Javascript - Почему Ramda over function здесь не работает? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь заполнить объект другим, используя ключи в качестве ссылки.

// 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 () func ...

Так что я изменил его с помощью R.clone () , и это выдало мне ошибку о том, что параметр не является функцией.

Помимо того факта, что теперь функция слияния устарела, я хочу заменить ее чем-то, что поможет мне не преобразовывать complexValue

1 Ответ

0 голосов
/ 01 декабря 2018

Ты не так уж далеко на самом деле.Думаю, все, чего вам не хватает, это проверки того, является ли 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>
...