Группировать элементы массива по подстроке JavaScript - PullRequest
1 голос
/ 17 апреля 2020

У меня есть список элементов, подобных этому

[{
  "id": 1,
  "id_team": "1.",
  "name": "Name",
}, {
  "id": 2,
  "id_team": "2.",
  "name": "Name",
}, {
  "id": 3,
  "id_team": "3.",
  "name": "Name",
}, {
  "id": 4,
  "id_team": "4.",
  "name": "Name",
}, {
  "id": 5,
  "id_team": "5.",
  "name": "Name",
}, {
  "id": 6,
  "id_team": "2.1.",
  "name": "Name",
}, {
  "id": 7,
  "id_team": "6.",
  "name": "Name",
}, {
  "id": 8,
  "id_team": "1.1.",
  "name": "Name",
}, {
  "id": 9,
  "id_team": "1.2.",
  "name": "Name",
}, {
  "id": 10,
  "id_team": "1.3.",
  "name": "Name",
}, {
  "id": 11,
  "id_team": "1.4.",
  "name": "Name",
}]

a, показанный в примере, у меня есть некоторая строка в столбце id_team, которая находится внутри другой строки в том же столбце в массиве

Например, основная команда будет 1., затем 1.1. и 1.2., и так далее будет частью 1.

, поэтому результат должен быть таким:

[{
  "id": 1,
  "id_team": "1.",
  "name": "Name",
  "subteams": [{
      "id": 8,
      "id_team": "1.1.",
      "name": "Name",
    }, {
      "id": 9,
      "id_team": "1.2.",
      "name": "Name",
    }, {
      "id": 10,
      "id_team": "1.3.",
      "name": "Name",
    }, {
      "id": 11,
      "id_team": "1.4.",
      "name": "Name",
    },],
}, {
  "id": 2,
  "id_team": "2.",
  "name": "Name",
  "subitems": [{
      "id": 6,
      "id_team": "2.1.",
      "name": "Name",
    },]
}, {
  "id": 3,
  "id_team": "3.",
  "name": "Name",
  "subitems": [],
}, {
  "id": 4,
  "id_team": "4.",
  "name": "Name",
  "subitems": [],
}, {
  "id": 5,
  "id_team": "5.",
  "name": "Name",
  "subitems": [],
}, {
  "id": 7,
  "id_team": "6.",
  "name": "Name",
  "subitems": [],
},]

это выполнимо? Я использую loda sh, если это облегчит задачу.

РЕДАКТИРОВАТЬ

У меня есть что-то вроде этого

    teams.filter(item => item.id_team.length <= size).map((item) => {
        const subteams = teams.filter((team) => 
        team.id_team.indexOf(item.id_team) === 0 && item.id_team !== team.id_team);
        console.log(subteams);
        return {
          ...item,
          subteams,
        };
      }) || [];

эта своего рода работа, так как она будет вставлена ​​в Массив подгрупп, но проблема в том, что это должно работать для многих уровней, возьмем этот пример

[{
  "id": 1,
  "id_team": "1.",
  "name": "Team Name",
  "subteams": [{
    "id": 8,
    "id_team": "1.1.",
    "name": "Team Name",
  }, {
    "id": 9,
    "id_team": "1.2.",
    "name": "Team Name",
  }, {
    "id": 10,
    "id_team": "1.3.",
    "name": "Team Name",
  }, {
    "id": 11,
    "id_team": "1.4.",
    "name": "Team Name",
  }, {
    "id": 12,
    "id_team": "1.1.1",
    "name": "Team Name",
  }]
}, {
  "id": 2,
  "id_team": "2.",
  "name": "Team Name",
  "subteams": [{
    "id": 6,
    "id_team": "2.1.",
    "name": "Team Name",
  }]
}, {
  "id": 3,
  "id_team": "3.",
  "name": "Team Name",
  "subteams": []
}, {
  "id": 4,
  "id_team": "4.",
  "name": "Team Name",
  "subteams": []
}, {
  "id": 5,
  "id_team": "5.",
  "name": "Team Name",
  "subteams": []
}, {
  "id": 7,
  "id_team": "6.",
  "name": "Team Name",
  "subteams": []
}]

, в этом примере есть команда с id_team = 1.1.1., как я могу добавить эту команду в подгруппу команды с id_team 1.1. с тем же логом c, я пытался рекурсивно использовать тот же код, но он не работал.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

let data = [{
  "id": 1,
  "id_team": "1.",
  "name": "Name",
}, {
  "id": 2,
  "id_team": "2.",
  "name": "Name",
}, {
  "id": 3,
  "id_team": "3.",
  "name": "Name",
}, {
  "id": 4,
  "id_team": "4.",
  "name": "Name",
}, {
  "id": 5,
  "id_team": "1.2.5.",
  "name": "Name",
}, {
  "id": 6,
  "id_team": "2.1.",
  "name": "Name",
}, {
  "id": 7,
  "id_team": "6.",
  "name": "Name",
}, {
  "id": 8,
  "id_team": "1.1.",
  "name": "Name",
}, {
  "id": 9,
  "id_team": "1.2.",
  "name": "Name",
}, {
  "id": 10,
  "id_team": "1.3.",
  "name": "Name",
}, {
  "id": 11,
  "id_team": "1.4.",
  "name": "Name",
}];

data = data.map(node=>{
  let t = node.id_team.split('.').filter(n=>n);
  let parent = t.splice(0,t.length-1).join('.');
  return {
    ...node,
    parent: !!parent ? parent+'.' : null
  }
});

let tree = (items, id = null) =>
  items
    .filter(item => item.parent === id)
    .map(item => ({ ...item, subTeams: tree(items, item.id_team) }));


console.log(JSON.stringify(tree(data),null,2));
0 голосов
/ 20 апреля 2020

Из кода примера я только что проверил, есть ли в массиве подгруппы данных, если он есть, я использую знакомый с рекурсивной функцией и назначил его подгруппам.

 getSubTeams(teams, size) {
      const filtered = teams.filter(item => item.id_team.length <= size);

      return filtered.map((item) => {
        let subteams = teams.filter((team) => team.id_team.indexOf(item.id_team) === 0 && item.id_team !== team.id_team);
        if (subteams.length > 0) {
          let aux = this.getSubTeams(subteams, size + 2);
          subteams = [
            ...aux,
          ];
        }
        return {
          ...item,
          subteams,
        };
      }) || [];
    },
0 голосов
/ 17 апреля 2020
const items = data.reduce((acc, item, index) => {
    const id_team = item.id_team.split('.')[0] + '.';
    const current = acc.find(record => record.id_team === id_team);

    if(current) current.subteams.push(item);
    else acc.push({
        id: index + 1,
        id_team,
        subteams: [item]
    });

    return acc;
}, []);
...