Сопоставить массив Javascript и преобразовать объекты в него в определенный формат? - PullRequest
2 голосов
/ 26 октября 2019

У меня есть массив объектов

const mainArray = [{
    name: 'main name',
    id: 'main id',
    parent: [{
      name: 'parent name',
      id: '1'
    }],
    child: [{
      name: 'child name',
      id: 'child id'
    }]
  }, {
    name: 'main name 2',
    id: 'main id 2',
    parent: [{
      name: 'parent name',
      id: '1'
    }],
    child: [{
      name: 'child name 2',
      id: 'child id 2'
    }]
  },
  {
    name: 'main name 3',
    id: 'main id 3',
    parent: [{
      name: 'parent name something else',
      id: '2'
    }],
    child: [{
      name: 'child name 3',
      id: 'child id 3'
    }]
  }
]

Мне нужно привести его к этой форме

const resultArray = [{
  key: 'main',
  title: 'main name',
}, {
  key: 'parent',
  title: 'parent name'
}, {
  key: 'child',
  title: 'child name'
}]

Пока я получил это

if (mainArray) {
   mainArray.map((main) => {
     if (main.child && main.child.length) {
       if (main.parent && main.parent.length) {
         main.parent.map((item) => {
           data.push({
             key: 'parent',
             title: item.name
           });
         });
       }

       data.push({
         key: 'main',
         title: main.name
       });

       main.child.map((item) => {
         data.push({
           key: 'child',
           title: item.name
         });
       });
     }
   });
 }

Итогда я беру это data array, чтобы отобразить, если таблица, и она выглядит следующим образом

enter image description here

Моя проблема в том, что два mains могут быть разными, ноимеют один и тот же parent (у родителей один и тот же ids), и тогда мне не нужно добавлять родителя в массив два раза, и мне нужно, чтобы он отображался следующим образом

enter image description here

Итак, я ищу способ, если два parents объекта имеют одинаковые id, чтобы объединить их так, чтобы в конечном массиве был только один parentи main и child этого родителя застревают к одному parent вместо двух идентичных

Здесь ссылка на jsfiddle

я могуиспользуйте lodash

1 Ответ

1 голос
/ 26 октября 2019

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

const mainArray = [{"name":"main name","id":"main id","parent":[{"name":"parent name","id":"1"}],"child":[{"name":"child name","id":"child id"}]},{"name":"main name 2","id":"main id 2","parent":[{"name":"parent name","id":"1"}],"child":[{"name":"child name 2","id":"child id 2"}]},{"name":"main name 3","id":"main id 3","parent":[{"name":"parent name something else","id":"2"}],"child":[{"name":"child name 3","id":"child id 3"}]}]


function children(rest, child) {
  const result = [{
    key: 'main',
    title: rest.name
  }];
  result.push(...child.map(({
    name
  }) => ({
    key: 'child',
    title: name
  })))
  return result;
}

const groupByParent = mainArray.reduce((r, {
  parent,
  child,
  ...rest
}) => {
  parent.forEach(p => {
    if (!r[p.name]) {
      r[p.name] = [{
          key: 'parent',
          title: p.name
        },
        ...children(rest, child)
      ]
    } else {
      r[p.name].push(...children(rest, child));
    }
  })

  return r;
}, {})

const result = Object.values(groupByParent).flat()
console.log(result)
...