У меня есть небольшие проблемы с моим кодом:
[
{
"key": 0,
"server": 0
},
{
"key": 0,
"server": 1
},
{
"key": 1,
"server": 0
}
]
как я могу привести к:
[
{ key: 0 , server:[0,1] },
{ key: 1 , server:[0] }
]
Я использую _.groupBy, но он не возвращает ожидаемых результатов.
Как объединить объект mutil в массиве с lodash?





еще не проверял
arr.reduce(function(acc,value){
const isExists = acc.findIndex(({key})=>key===value.key)
if (!isExists){
acc.push(value)
} else {
let servers = acc[isExists].server
if (!Array.isArray(servers))
servers = [servers]
servers.push(value.server)
servers = _.uniq(servers)
acc[isExists].server = servers
}
return acc
},[])
Одним из решений может быть использование комбинации 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.info(test);<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>Я еще не пробовал, но я отредактирую ответ, если у меня будет более короткое решение.
new Vue({
el: "#app",
data: {
needMergedArray: [
{
key: 0,
server: 0
},
{
key: 0,
server: 1
},
{
key: 1,
server: 0
}
],
},
methods: {
mergeObject() {
let merged = [];
this.needMergedArray.map(item => {
let found = false;
merged.map(element => {
if (item.key === element.key) {
found = true;
if (!element.server) {
//const myserver = [item.server];
element.server =[item.server];
} else {
element.server.push(item.server);
}
}
});
if (!found) {
const myserver = [item.server];
merged.push({key: item.key, server: myserver});
}
found = false;
});
return merged;
}
}
})
// one loop solution: https://jsfiddle.net/haianhnc/2mhsquad/78
mergeObject() {
let merged = {};
this.needMergedArray.map(item => {
merged = {...merged, [item.key]: {key: [item.key], server: (merged[item.key] && merged[item.key].server || []).concat(item.server)}};
});
return Object.values(merged);
}
}
этот код хорошо работает, но, может быть, можно сократить еще? , если нет, то все в порядке, действительно спасибо вам