Формат массива объектов с различными структурами данных - PullRequest
0 голосов
/ 18 июня 2019

У меня есть следующие данные:

   const match = 'A'

   const data = [
    {
        age: "12", 
        group: [
            {club: 'A'},
            {club: 'B'}
        ],
        active: {
            sjbuas777: {club: 'A'},
            122kk7dgs: {club: 'B'}
        }
    },
    {
        age: "11", 
        group: [
            {club: 'A'},
            {club: 'D'}
        ],
        active: {
            djs7skww3: {club: 'C'},
            sjhsjs72k: {club: 'B'}
        }
    },
        {
        age: "12", 
        group: [
            {club: 'A'},
            {club: 'D'}
        ],
        active: {
            shshs6kka: {club: 'A'},
            5d8jallo1: {club: 'C'}
        }
    },
    {
        age: "13", 
        group: [
            {club: 'C'},
            {club: 'S'}
        ],
        active: {
            kks7sjkla: {club: 'A'},
            jjs66s5as: {club: 'B'}
        }
    }
]

Как я могу сгруппировать данные по возрасту и дать счетчик groups и active, где значение club равно matchдля этого возраста?Обратите внимание, что ключи в активном объекте неизвестны.

Требуемый вывод:

[
    {age: "11", group: 1, active: 0},
    {age: "12", group: 2, active: 2},
    {age: "13", group: 0, active: 1}
]

Заранее большое спасибо.

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

Я хотелчтобы показать, где я сейчас нахожусь:

 function getCountsByAge() {
    return [
      ...new Set([
        ...Object.values(data)
            .filter(d => d.group
            .some(({club}) => club === match))
            .map(result => result)

      ])
    ]
  }

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Вы можете создать карту с указанием возраста, со всеми отсчетами, установленными на ноль, а затем увеличить эти подсчеты, отфильтровав, где клуб соответствует:

const match = "A";
const data = [{age: "12",group: [{club: 'A'},{club: 'B'}],active: {sjbuas777: {club: 'A'},"122kk7dgs": {club: 'B'}}}, {age: "11",group: [{club: 'A'},{club: 'D'}],active: {djs7skww3: {club: 'C'},sjhsjs72k: {club: 'B'}}}, {age: "12",group: [{club: 'A'},{club: 'D'}],active: {shshs6kka: {club: 'A'},"5d8jallo1": {club: 'C'}}}, {age: "13",group: [{club: 'C'},{club: 'S'}],active: {kks7sjkla: {club: 'A'},jjs66s5as: {club: 'B'}}}];

const map = new Map(data.map(({age}) => [age, { age, group: 0, active: 0 }]));
for (const {age, group, active} of data) {
    map.get(age).group += group.filter(({club}) => club === match).length;
    map.get(age).active += Object.values(active).filter(({club}) => club === match).length;
}
const result = [...map.values()];

console.log(result);
0 голосов
/ 18 июня 2019

Этот фрагмент кода будет делать то, что вы хотите.

    const match = 'A'

    const data = [
        {
            age: "12", 
            group: [
                {club: 'A'},
                {club: 'B'}
            ],
            active: {
                'sjbuas777': {club: 'A'},
                '22kk7dgs': {club: 'B'}
            }
        },
        {
            age: "11", 
            group: [
                {club: 'A'},
                {club: 'D'}
            ],
            active: {
                'djs7skww3': {club: 'C'},
                'sjhsjs72k': {club: 'B'}
            }
        },
            {
            age: "12", 
            group: [
                {club: 'A'},
                {club: 'D'}
            ],
            active: {
                'shshs6kka': {club: 'A'},
                '5d8jallo1': {club: 'C'}
            }
        },
        {
            age: "13", 
            group: [
                {club: 'C'},
                {club: 'S'}
            ],
            active: {
                'kks7sjkla': {club: 'A'},
                'jjs66s5as': {club: 'B'}
            }
        }
    ]
    
    function clubMatch(acc, obj) {
      return obj.club === match ?  acc + 1 : acc
    }
    
    output = []
    temp = {}
    data.forEach(function(obj) {
      if (output.includes(obj.age)) {
        temp[obj.age] = {
          group: obj.group.reduce(clubMatch, temp[obj.age].group),
          active: Object.values(obj.active).reduce(clubMatch, temp[obj.age].active)
        }
      } else {
        output.push(obj.age)
        temp[obj.age] = {
          group: obj.group.reduce(clubMatch, 0),
          active: Object.values(obj.active).reduce(clubMatch, 0)
        }
      }
    })

    output.sort()
    output = output.map((age) => {
      return {
        age: age,
        group: temp[age].group,
        active: temp[age].active
      };
    })
    
    console.log(output)
0 голосов
/ 18 июня 2019

   const match = 'A'

   const data = [
    {
        age: "12", 
        group: [
            {club: 'A'},
            {club: 'B'}
        ],
        active: {
            sjbuas777: {club: 'A'},
            '122kk7dgs': {club: 'B'}
        }
    },
    {
        age: "11", 
        group: [
            {club: 'A'},
            {club: 'D'}
        ],
        active: {
            djs7skww3: {club: 'C'},
            sjhsjs72k: {club: 'B'}
        }
    },
        {
        age: "12", 
        group: [
            {club: 'A'},
            {club: 'D'}
        ],
        active: {
            shshs6kka: {club: 'A'},
            '5d8jallo1': {club: 'C'}
        }
    },
    {
        age: "13", 
        group: [
            {club: 'C'},
            {club: 'S'}
        ],
        active: {
            kks7sjkla: {club: 'A'},
            jjs66s5as: {club: 'B'}
        }
    }
]

const acc = {};

data.forEach(d => {
    if(!acc[d.age]){
        acc[d.age] = {age: d.age, group: 0, active: 0 }
    }
    acc[d.age].group += d.group.filter(g => g.club == match).length;
    acc[d.age].active += Object.values(d.active).filter(a => a.club == match).length;
});

const res = Object.values(acc);

console.log(res);
...