nastya_zholudeva
@nastya_zholudeva

Как сделать рекурсию в таком случае?

Есть массив
var products = [
	{
  	name: 'pac1',
    packingLevel: 1,
    childItems: [
    	{
      	name: 'prod1',
    		packingLevel: 0,
      },
      {
      	name: 'prod2',
    		packingLevel: 0,
      }
    ]
   
  },
  
  {
  	name: 'pac2',
    packingLevel: 2,
    childItems: [
    	{
      	name: 'upac1',
    		packingLevel: 1,
        childItems: [
          {
            name: 'prod01',
            packingLevel: 0,
          },
           {
            name: 'prod02',
            packingLevel: 0,
          }
        ]
      },
      {
      	name: 'prod2',
    		packingLevel: 0,
      }
    ]
   
  },
  {
    name: 'prod11'
  },
];


его нужно превратить в
var packing = [
  {
      name: 'prod1',
      packingLevel: 1,
      childItems: [
        {
          name: 'pac1',
          packingLevel: 0,
        }
      ]

    },
    {
  	name: 'prod2',
    packingLevel: 1,
    childItems: [
    	{
      	name: 'pac1',
    		packingLevel: 0,
      }
    ]
   
  },
	{
  	name: 'prod01',
    packingLevel: 2,
    childItems: [
      {
        name: 'upac1',
        packingLevel: 1,
        childItems: [
          {
            name: 'pac2',
            packingLevel: 0,
          }
        ]
      }
    ]
   
  },
  {
  	name: 'prod02',
    packingLevel: 2,
    childItems: [
      {
        name: 'upac1',
        packingLevel: 1,
        childItems: [
          {
            name: 'pac2',
            packingLevel: 0,
          }
        ]
      }
    ]
   
  },
  {
    name: 'prod11'
  },
];

И обратно.
С одним уровнем вложенности, без рекурсии, у меня получилось реализовать , а вот если вложенность больше 1 уровня, уже не получается, не понятно, где применить рекурсию, чтобы правильно массив построился.
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вспомогательная функция, очень нужна, не спрашивайте зачем:

const getReversedPaths = (arr, path = []) =>
  arr.reduce((acc, { childItems, ...item }) => {
    path.push(item);

    if (childItems) {
      acc.push(...getReversedPaths(childItems, path));
    } else {
      acc.push(path.length > 1
        ? path.map(({ packingLevel }, i, a) => ({ ...a[a.length - i - 1], packingLevel }))
        : [ path[0] ]
      );
    }

    path.pop();

    return acc;
  }, []);

Туда:

const reverseThere = arr =>
  getReversedPaths(arr).map(n =>
    n.reduceRight((child, parent) => ({ ...parent, childItems: [ child ] }))
  );

Обратно:

const reverseBackAgain = arr =>
  (function createTree(arr) {
    return Object.values(arr.reduce((acc, [ head, ...tail ]) => {
      if (tail.length) {
        (acc[head.name] = acc[head.name] || { ...head, childItems: [] }).childItems.push(tail);
      } else {
        acc[head.name] = head;
      }

      return acc;
    }, {})).map(n => (n.childItems && (n.childItems = createTree(n.childItems)), n));
  })(getReversedPaths(arr));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы