Как поместить каждое значение в массив, который уже был сгруппирован по значению? - PullRequest
2 голосов
/ 22 мая 2019

Я почти решил эту проблему, но у меня есть стек о том, как поместить определенное значение в массив. Идея состоит в том, чтобы "сгруппировать" массив, имеющий тот же идентификатор, и объединить все его значения в одно свойство в этом случае.свойство "персонаж", это уже сделано, мне удалось решить его, проблема в том, что я не могу получить значение свойства роли, как я могу его получить?я пробовал map, но я получил массив ролей от индекса 0 до 2. Я также пробовал _.forEach, но тот же результат я использую lodash.

var groupArr = [ { id: 'Jesse', role: 'merchant', character: 'Orc', }, { id: 'David', role: 'hero', character: 'Blade Knight', }, { id: 'Jesse', role: 'merchant', character: 'Elf', }, { id: 'Steve', role: 'villain', character: 'Undead OverLord', }, { id: 'Jesse', role: 'merchant', character: 'Wizard', }, ]

var output = _(groupArr).groupBy(a => a.id).map((objs, key) => ({
        'id': key,
        'role': key,
        'character': _.map(objs, 'character')
    }))
    .value();

console.log(output);

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы можете взять роль с 1-го пункта в группе:

var groupArr = [ { id: 'Jesse', role: 'merchant', character: 'Orc', }, { id: 'David', role: 'hero', character: 'Blade Knight', }, { id: 'Jesse', role: 'merchant', character: 'Elf', }, { id: 'Steve', role: 'villain', character: 'Undead OverLord', }, { id: 'Jesse', role: 'merchant', character: 'Wizard', }, ]

var output = _(groupArr)
  .groupBy('id')
  .map((objs, key) => ({
    'id': key,
    'role': _.head(objs).role,
    'character': _.map(objs, 'character')
  }))
  .value();

console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 22 мая 2019

Это «groupBy», который вы спросили, я позволю вам затем сделать «слияние»

var groupArr = [
    { id: 'Jesse', role: 'merchant', character: 'Orc', },
    { id: 'David', role: 'hero', character: 'Blade Knight', },
    { id: 'Jesse', role: 'merchant', character: 'Elf', },
    { id: 'Steve', role: 'villain', character: 'Undead OverLord', },
    { id: 'Jesse', role: 'merchant', character: 'Wizard', }
];


let byId = groupArr.reduce( (acc, i) => {
    acc[i.id] = acc[i.id] || [];
    acc[i.id].push(i);
    return acc;
}, {});


Object.keys(byId).forEach(id => {
   let values = byId[id];
   //Do the merge
});

Можно также сделать так

let merged = [... newSet(groupArr.map(e => e.id))]
.map( id => {
    let values = groupArr.filter( e => e.id === id );
    let merge = {}; //You do
    return merge;
});
...