我有一个对象数组,看起来像这样:
let fruitSamples = [
[
{'id': 1,'type': 'apples','samples': [1, 2, 3]},
{'id': 2,'type': 'bananas','samples': [1, 2, 7]},
{'id': 3,'type': 'pears','samples': [1, 2, 3]}
],
[
{'id': 1,'type': 'apples','samples': [5, 2, 9]},
{'id': 2,'type': 'bananas','samples': [1, 7, 7]},
{'id': 3,'type': 'pears','samples': [12, 21, 32]}
],
[
{'id': 1,'type': 'apples','samples': [11, 2, 33]},
{'id': 2,'type': 'bananas','samples': [17, 2, 67]},
{'id': 3,'type': 'pears','samples': [91, 22, 34]}
]
];
我想使用lodash将上面的数组简化并合并为一个数组,以便将样本连接在一起,如下所示:
fruitSamples = [
{'id': 1, 'type': 'apples', 'samples': [1,2,3,5,2,9,11,2,33]},
{'id': 2, 'type': 'bananas', 'samples': [1,2,7,1,7,7,17,2,67]},
{'id': 3, 'type': 'pears', 'samples': [1,2,3,12,21,32,91,22,34]},
]
我尝试了许多不同的方法,但是由于我想以最短的途径解决此问题,您的建议是什么?
我已经尝试过了:
let test = _(fruitSamples)
.flatten()
.groupBy('type')
.map(_.spread(_.merge))
.value();
console.log(test);
这给了我以下结果,该结果没有连接样本:
test = [
{'id': 1,'type': 'apples','samples': [11, 2, 33]},
{'id': 2,'type': 'bananas','samples': [17, 2, 67]},
{'id': 3,'type': 'pears','samples': [91, 22, 34]}
]
我觉得使用_.mergeWith可能是正确的答案,如果是这样,我正在寻求以最佳可能的方式实现mergeWith的帮助,因为我不确定该怎么做。有什么建议吗?
答案 0 :(得分:2)
您可以尝试使用_.mergeWith
来接受_.merge
函数,该函数可用于自定义分配的值,而不是customizer
。
此方法类似于
_.merge
,但它接受的定制程序是 调用以生成目标和源的合并值 属性。
let fruitSamples = [
[
{'id': 1,'type': 'apples','samples': [1, 2, 3]},
{'id': 2,'type': 'bananas','samples': [1, 2, 7]},
{'id': 3,'type': 'pears','samples': [1, 2, 3]}
],
[
{'id': 1,'type': 'apples','samples': [5, 2, 9]},
{'id': 2,'type': 'bananas','samples': [1, 7, 7]},
{'id': 3,'type': 'pears','samples': [12, 21, 32]}
],
[
{'id': 1,'type': 'apples','samples': [11, 2, 33]},
{'id': 2,'type': 'bananas','samples': [17, 2, 67]},
{'id': 3,'type': 'pears','samples': [91, 22, 34]}
]
];
function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
let test = _(fruitSamples)
.flatten()
.groupBy('type')
.map(_.spread((...values) => {
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)
不知道如何使用lodash,但是使用纯Javascript并不是很难。
更新:由于@Taki首先做了
flat()
,这使得它变得更加均匀 更容易..
let fruitSamples = [[{"id":1,"type":"apples","samples":[1,2,3]},{"id":2,"type":"bananas","samples":[1,2,7]},{"id":3,"type":"pears","samples":[1,2,3]}],[{"id":1,"type":"apples","samples":[5,2,9]},{"id":2,"type":"bananas","samples":[1,7,7]},{"id":3,"type":"pears","samples":[12,21,32]}],[{"id":1,"type":"apples","samples":[11,2,33]},{"id":2,"type":"bananas","samples":[17,2,67]},{"id":3,"type":"pears","samples":[91,22,34]}]];
let concat = fruitSamples.flat().reduce((a, i) => {
const f = a.find(f => f.id === i.id);
if (!f) a.push(i);
else f.samples = [...f.samples, ...i.samples];
return a;
}, []);
console.log(concat);
答案 2 :(得分:0)
您可以先使用.reduce
将一个或多个数组转换为简单数组,然后再次使用.reduce
进行分组。
可能更容易抓住
类似
let fruitSamples = [
[
{'id': 1,'type': 'apples','samples': [1, 2, 3]},
{'id': 2,'type': 'bananas','samples': [1, 2, 7]},
{'id': 3,'type': 'pears','samples': [1, 2, 3]}
],
[
{'id': 1,'type': 'apples','samples': [5, 2, 9]},
{'id': 2,'type': 'bananas','samples': [1, 7, 7]},
{'id': 3,'type': 'pears','samples': [12, 21, 32]}
],
[
{'id': 1,'type': 'apples','samples': [11, 2, 33]},
{'id': 2,'type': 'bananas','samples': [17, 2, 67]},
{'id': 3,'type': 'pears','samples': [91, 22, 34]}
]
];
var merged = fruitSamples.reduce(function(prev, next) {
return prev.concat(next);
});
var res = merged.reduce(function(prev, next) {
var index = prev.findIndex(o=> o.id == next.id)
if(index >= 0)
prev[index].samples = [...prev[index].samples,...next.samples];
else
prev.push(next);
return prev;
},[]);
console.log(res)
答案 3 :(得分:0)
使用javascript且不使用破折号的一种方法:
var fruitSamples = [
[
{'id': 1,'type': 'apples','samples': [1, 2, 3]},
{'id': 2,'type': 'bananas','samples': [1, 2, 7]},
{'id': 3,'type': 'pears','samples': [1, 2, 3]}
],
[
{'id': 1,'type': 'apples','samples': [5, 2, 9]},
{'id': 2,'type': 'bananas','samples': [1, 7, 7]},
{'id': 3,'type': 'pears','samples': [12, 21, 32]}
],
[
{'id': 1,'type': 'apples','samples': [11, 2, 33]},
{'id': 2,'type': 'bananas','samples': [17, 2, 67]},
{'id': 3,'type': 'pears','samples': [91, 22, 34]}
]
];
var test = fruitSamples.flat().reduce((rv,x)=>{
var f = rv.find(y => y.id == x.id);
if(f == null){
f ={"id":x.id, "type":x.type,"samples":x.samples};
rv.push(f);
}
else{
f.samples = f.samples.concat(x.samples);
}
return rv;
},[]);
console.log(JSON.stringify(test))