Size: a a a

JavaScript — русскоговорящее сообщество

2020 June 03

A

Alex in JavaScript — русскоговорящее сообщество
Sm•ok 😈✔️
А почему ты к таймстемпу присваиваешь xhr?
Ой опечатка😊
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
Привет всем!
Столкнулся с такой проблемой. Есть массив категорий, у некоторых категорий есть children'ы, то есть, у них один уровень вложенности. Но, есть категории у каких два уровня вложенности. Вот к примеру один уровень вложенности: Mac -> MacBook Pro. Вот пример двух уровней вложенности: Mac -> MacBook Pro -> MacBook Pro 2019.
Каждая категория имеет parent свойство которое равно родительской категории. Изначально у меня был csv файл в которым были в разброс эти все категории и нужно было привести их к следующему формату:
{
   "children": [
     {
       "id": "852",
       "slug": "macbook-air-2020",
       "name_ru": "MacBook Air 2020",
       "name_ua": "MacBook Air 2020",
       "parent": "102"
     }
   ],
   "id": "102",
   "name_ru": "MacBook Air",
   "name_ua": "MacBook Air",
   "slug": "macbook-air",
   "parent": "71"
 }


такого результата я достиг при помощи следующей логики:

const categoriesModified = jsonArr.map((p) => {
   return {
     id: p["Term ID"],
     slug: p["Slug"],
     name_ru: p["Name"],
     name_ua: p["Name"],
     parent: p["Parent Term ID"]
   };
 });

 const categories = categoriesModified.map((o) => {
   const children = categoriesModified.filter(c => c.parent === o.id)
;
   return {
     children, id: o.id, name_ru: o.name_ru, name_ua: o.name_ua, slug: o.slug, parent: o.parent
   }
 })
Т
аким образом я достиг одного уровня вложенности категорий. Собственно вопрос, как мне переделать мою логику таким образом, чтобы я мог иметь два уровня вложенности? Вот пример как мне нужно получить два уровня:

{
   "name_ru": "Mac",
   "name_ua": "Mac",
   "slug": "mac",
   "count": 0,
   "children": [
     {
       "name_ru": "Б/у Mac",
       "name_ua": "Б/у Mac",
       "slug": "mac-used",
       "count": 0
     },
     {
       "name_ru": "MacBook Pro",
       "name_ua": "MacBook Pro",
       "slug": "macbook-pro",
       "count": 0,
       "children": [
         {
           "name_ru": "MacBook Pro 2019",
           "name_ua": "MacBook Pro 2019",
           "slug": "macbook-pro-2019",
           "count": 0
         },
         {
           "name_ru": "MacBook Pro 2018",
           "name_ua": "MacBook Pro 2018",
           "slug": "macbook-pro-2018",
           "count": 0
         },
         {
           "name_ru": "MacBook Pro 2017",
           "name_ua": "MacBook Pro 2017",
           "slug": "macbook-pro-2017",
           "count": 0
         }
       ]
     }
   }
 ]
источник

t

th.witness in JavaScript — русскоговорящее сообщество
John Gotti
Привет всем!
Столкнулся с такой проблемой. Есть массив категорий, у некоторых категорий есть children'ы, то есть, у них один уровень вложенности. Но, есть категории у каких два уровня вложенности. Вот к примеру один уровень вложенности: Mac -> MacBook Pro. Вот пример двух уровней вложенности: Mac -> MacBook Pro -> MacBook Pro 2019.
Каждая категория имеет parent свойство которое равно родительской категории. Изначально у меня был csv файл в которым были в разброс эти все категории и нужно было привести их к следующему формату:
{
   "children": [
     {
       "id": "852",
       "slug": "macbook-air-2020",
       "name_ru": "MacBook Air 2020",
       "name_ua": "MacBook Air 2020",
       "parent": "102"
     }
   ],
   "id": "102",
   "name_ru": "MacBook Air",
   "name_ua": "MacBook Air",
   "slug": "macbook-air",
   "parent": "71"
 }


такого результата я достиг при помощи следующей логики:

const categoriesModified = jsonArr.map((p) => {
   return {
     id: p["Term ID"],
     slug: p["Slug"],
     name_ru: p["Name"],
     name_ua: p["Name"],
     parent: p["Parent Term ID"]
   };
 });

 const categories = categoriesModified.map((o) => {
   const children = categoriesModified.filter(c => c.parent === o.id)
;
   return {
     children, id: o.id, name_ru: o.name_ru, name_ua: o.name_ua, slug: o.slug, parent: o.parent
   }
 })
Т
аким образом я достиг одного уровня вложенности категорий. Собственно вопрос, как мне переделать мою логику таким образом, чтобы я мог иметь два уровня вложенности? Вот пример как мне нужно получить два уровня:

{
   "name_ru": "Mac",
   "name_ua": "Mac",
   "slug": "mac",
   "count": 0,
   "children": [
     {
       "name_ru": "Б/у Mac",
       "name_ua": "Б/у Mac",
       "slug": "mac-used",
       "count": 0
     },
     {
       "name_ru": "MacBook Pro",
       "name_ua": "MacBook Pro",
       "slug": "macbook-pro",
       "count": 0,
       "children": [
         {
           "name_ru": "MacBook Pro 2019",
           "name_ua": "MacBook Pro 2019",
           "slug": "macbook-pro-2019",
           "count": 0
         },
         {
           "name_ru": "MacBook Pro 2018",
           "name_ua": "MacBook Pro 2018",
           "slug": "macbook-pro-2018",
           "count": 0
         },
         {
           "name_ru": "MacBook Pro 2017",
           "name_ua": "MacBook Pro 2017",
           "slug": "macbook-pro-2017",
           "count": 0
         }
       ]
     }
   }
 ]
Рекурсия — твой друг.
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
th.witness
Рекурсия — твой друг.
если не сложно, можешь пожалуйста какой то минимальный пример накидать как будет в данном случае? думал над рекурсией, но что то сломался
источник

t

th.witness in JavaScript — русскоговорящее сообщество
John Gotti
если не сложно, можешь пожалуйста какой то минимальный пример накидать как будет в данном случае? думал над рекурсией, но что то сломался
Закинь на кодепен минимальные входные и выходные, чтобы мы могли понять, что тебе нужно.
источник

t

th.witness in JavaScript — русскоговорящее сообщество
John Gotti
если не сложно, можешь пожалуйста какой то минимальный пример накидать как будет в данном случае? думал над рекурсией, но что то сломался
Ну или где тебе удобно.
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
сейчас на pastebin закину
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
th.witness
Ну или где тебе удобно.
источник

t

th.witness in JavaScript — русскоговорящее сообщество
Нужно получить из того, что ты уже преобразовал?
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
да
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
я думал ан счет того, чтобы итерировать children'ы если они есть и записывать это все к соответствующему родитель, думал это делать также через map, но что то не выходит
источник

t

th.witness in JavaScript — русскоговорящее сообщество
John Gotti
я думал ан счет того, чтобы итерировать children'ы если они есть и записывать это все к соответствующему родитель, думал это делать также через map, но что то не выходит
Ты ведь просто хочешь засунуть все чилдрены в чилдрены к Mac?
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
по большому счету да
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
то есть, чтобы была такая иерархия
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
Mac -> MacBook Pro -> MacBook Pro 2019
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
там вот в пейстбин, на 188 строке пример
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
есть большая категория mac в ней есть дочерняя категория macbook air а в ней в свою очередь есть дочерние модели разных годов
источник

t

th.witness in JavaScript — русскоговорящее сообщество
John Gotti
есть большая категория mac в ней есть дочерняя категория macbook air а в ней в свою очередь есть дочерние модели разных годов
Покажи самый исходный массив. И как узнать ЧТО есть дочерняя категория другого?
источник

t

th.witness in JavaScript — русскоговорящее сообщество
Только по количеству слов в названии?
источник

JG

John Gotti in JavaScript — русскоговорящее сообщество
исходный массив такого формата:

{
   "id": "845",
   "slug": "macbook-air-2019",
   "name_ru": "MacBook Air 2019",
   "name_ua": "MacBook Air 2019",
   "parent": "102"
 },
 {
   "id": "842",
   "slug": "macbook-pro-2019",
   "name_ru": "MacBook Pro 2019",
   "name_ua": "MacBook Pro 2019",
   "parent": "99"
 },
источник