Группировать массив объектов на основе ключа типа массива - PullRequest
1 голос
/ 19 сентября 2019

Имея данные, подобные приведенным ниже:

[
  {
    gameId: id_0,
    groups: [1]
  },
  {
    gameId: id_1,
    groups: [2]
  },
  {
    gameId: id_2,
    groups: [1, 2]
  },
  {
    gameId: id_3,
    groups: [3]
  }
]

Я бы хотел, чтобы мое сокращение привело к массиву объектов вроде:

[
  {
    group: 1,
    data: [
      id_0, id_2 // gameId
    ]
  },
  {
    group: 2,
    data: [
      id_1, id_2
    ]
  },
  {
    group: 3,
    data: [
      id_3
    ]
  }
]

Я смог частично решить эту проблему, используяиндексы массива.Код, который у меня есть в настоящее время:

groupByArr = parameter => data => data.reduce((acc, curr) => {
  curr[parameter].forEach(key => {
    if (acc[key]) {
      acc[key].push(curr)
    } else {
      acc[key] = [curr]
    }
  })
  return acc
}, [])

, который создает массив массивов, где индекс основного массива - это идентификатор группы:

[
  empty,
  1: [
    id_0, id_2
  ],
  2: [
    id_1, id_2
  ],
  3: [
    id_3
  ]
]

Ответы [ 6 ]

1 голос
/ 19 сентября 2019

Вы можете использовать Array.prototype.reduce () в сочетании с Array.prototype.forEach () и Array.prototype.push () для возвратаОбъект и, наконец, получить значения с помощью Object.values ​​()

Код:

const data = [{gameId: 'id_0',groups: [1]},{gameId: 'id_1',groups: [2]},{gameId: 'id_2',groups: [1, 2]},{gameId: 'id_3',groups: [3]}]
const result = Object.values(data.reduce((acc, {gameId, groups}) => {
  groups.forEach(group => {
    acc[group] = acc[group] || { group, data: [] }
    acc[group].data.push(gameId)
  })
  return acc
}, {}))

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 19 сентября 2019

Вы должны попробовать это.Использование уменьшение в сгруппированных сценариях - лучшее, что дает нам JavaScript

let arr = [
{
        gameId: "id_0",
        groups: [1]
    },
    {
        gameId: "id_1",
        groups: [2]
    },
    {
        gameId: "id_2",
        groups: [1, 2]
    },
    {
        gameId: "id_3",
        groups: [3]
    }
];


const grouped = arr.reduce((acc, current) => {
    for(let x of current.groups){
        if(!acc[x]) {
            acc[x] = {group: x, data:[current.gameId]}
        } else {
            acc[x].data.push(current.gameId)
        }
    }
    return acc
},{});

console.log(Object.values(grouped))
0 голосов
/ 19 сентября 2019
`let b = [
  {
    gameId: "id_0",
    groups: [1]
  },
  {
    gameId: "id_1",
    groups: [2]
  },
  {
    gameId: "id_2",
    groups: [1, 2]
  },
  {
    gameId: "id_3",
    groups: [3]
  }
];

let d = new Map(); ;
b.forEach(function(a){
    a.groups.forEach(function(a1){
        if(d.get(a1)){
            d.get(a1).push(a.gameId);
        }else{
            d.set(a1, [a.gameId]);
        }
    });
});`
0 голосов
/ 19 сентября 2019

Попробуйте это

const data = [
    {gameId: 'id_0',groups: [1]},
    {gameId: 'id_1',groups: [2]},
    {gameId: 'id_2',groups: [1, 2]},
    {gameId: 'id_3',groups: [3]}
]

const single_id = data.filter(i => i.groups.length === 1)
const multiple_ids = data.filter(i => i.groups.length > 1)
let res = [];
single_id.map(i => {
    let data = {group: i.groups[0], data: [i.gameId]}
    multiple_ids.forEach(o => o.groups.includes(i.groups[0]) && (data.data.push(o.gameId)))
    res.push(data)
})
console.log(res)
0 голосов
/ 19 сентября 2019

Используйте объект как acc, затем добавьте к нему объекты:

  if (acc[key]) {
    acc[key].data.push(curr)
  } else {
     acc[key] = { group: key, data: [curr] };
  }

И, наконец, превратите возвращенный объект в массив:

 const result = Object.values(hash);
0 голосов
/ 19 сентября 2019

Пусть arr будет переменной, содержащей данные в следующем формате:

[
  empty,
  1: [
    id_0, id_2
  ],
  2: [
    id_1, id_2
  ],
  3: [
    id_3
  ]
]

Тогда может сделать следующий код: -

for(let i=1;i<arr.length;i++){
    arr[i-1] = {group:i,data:arr[i]};
}
arr[arr.length-1] = undefined; // To Prevent Unnecessary Errors
delete arr[arr.length-1]; // To Prevent Unnecessary Errors
arr.length -= -1;

Теперь arr будет в следующем формате: -

[
  {
    group: 1,
    data: [
      id_0, id_2
    ]
  },
  {
    group: 2,
    data: [
      id_1, id_2
    ]
  },
  {
    group: 3,
    data: [
      id_3
    ]
  }
]

Надеюсь, это поможет.Скажи мне, если я неправильно понял твой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...