Я почти решил эту проблему, но у меня есть стек о том, как поместить определенное значение в массив. Идея состоит в том, чтобы «сгруппировать» массив с одинаковым идентификатором и объединить все его значение в одно свойство, в этом случае «символ "свойство, это уже сделано, мне удалось это решить. Теперь проблема в том, что я не могу получить значение свойства роли, как я могу его получить? Я пробовал карту, но получил массив ролей от индекса 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);
@ Джесси - каков ожидаемый результат? Можете ли вы добавить пример?
Роль должна быть торговцем в массиве с индексом 0, в массиве с индексом 1 роль должна быть героем, массив с индексом 2 = злодей.
Можно взять роль из 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>
свойство роли должно быть значением роли
Хорошо, ты попал.
Вы спросили, что это «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;
});
Это нормально, но как это сделать в lodash?
Мне было непонятно, что lodash обязателен. Поскольку я никогда не использовал его, я не могу сказать. К сожалению :-/
При слиянии следует ли заменять значение, если оно существует?