我的代码有一些问题:
[
{
"key": 0,
"server": 0
},
{
"key": 0,
"server": 1
},
{
"key": 1,
"server": 0
}
]
我如何得出结果:
[
{ key: 0 , server:[0,1] },
{ key: 1 , server:[0] }
]
我正在使用_.groupBy
,但是它没有返回预期的结果。
如何用lodash合并数组中的mutil对象?
答案 0 :(得分:1)
一种解决方案是结合使用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>
答案 1 :(得分:1)
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;
}
}
})
答案 2 :(得分:1)
//一个循环解决方案:https://jsfiddle.net/haianhnc/2mhsquad/78
onPress={() => this.props.delete(i)}
答案 3 :(得分:0)
还没有测试
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
},[])