Одним из решений было бы использование комбинации groupBy
, map
и mergeWith
.
Таксначала вы группируете элементы по key
, поэтому в этом примере он вернет объект с 0
и 1
в качестве ключей, которые будут содержать сгруппированные элементы.
Затем вы используете .map
чтобы выполнить итерацию по возвращенному объекту и получить сгруппированные значения.
Наконец, вы используете .mergeWith
с функцией customizer
, которую можно использовать для настройки способа объединения значений клавиши server
.
const servers = [{
"key": 0,
"server": 0
},
{
"key": 0,
"server": 1
},
{
"key": 1,
"server": 0
}
];
function customizer(objValue, srcValue, key, fourth) {
if (key === 'server') {
if (!_.isArray(objValue)) objValue = [objValue];
return objValue.concat(srcValue);
}
}
let test = _(servers)
.groupBy('key')
.map((values, key) => {
if (values.length === 1) {
values[0].server = [values[0].server];
return values[0];
}
return _.mergeWith(...values, customizer);
})
.value();
console.log(test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>