如何根据键名合并2个数组并根据合并后的值排序? [英] How to merge 2 arrays based on a key name and sort based on the merged value?
本文介绍了如何根据键名合并2个数组并根据合并后的值排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有两个列表
const listA = [{"apple":100}, {"banana": 50}, {"pearl": 10}, {"cherry": 5}, {"kiwi": 3}]
const listB = [{"peach": 30}, {"apple": 15}, {"kiwi": 10}, {"mango": 5}]
问题是怎么办我将两个列表合并为一个堆栈,并以数字增量将同一项目合并,然后按数量排序?我的意思是最终结果应该是->
The question is how do I merge two list into one stack up the same item with number increment and sort by the qty? I mean the final result should be ->
const listMerged = [{"apple":115}, {"banana": 50} , {"peach": 30}, {"kiwi": 13}, {"pearl": 10}, {"cherry": 5}, {"mango": 5}]
我知道它会是这样的:
sortListDesc(list) {
return obj.sort(function (l1,l2) {
return l2< l1 ? -1
: l2 >l1 ? 1
: 0
})
}
但是
推荐答案
您可以使用 reduce
和 排序
和 Object.values
像这样:
You can use reduce
, and sort
and Object.values
like this:
const listA = [{"apple":100}, {"banana": 50}, {"pearl": 10}, {"cherry": 5}, {"kiwi": 3}]
, listB = [{"peach": 30}, {"apple": 15}, {"kiwi": 10}, {"mango": 5}]
let merged = Object.values(listA.concat(listB).reduce((acc, a) => {
const [k, v] = Object.entries(a)[0];
(acc[k] = acc[k] || {[k]: 0})[k] += v;
return acc;
}, {}));
merged.sort((a, b) => Object.values(b)[0] - Object.values(a)[0]);
console.log(merged);
或者,
使用 reduce
创建一个对象,其中所有水果为键,单个总和为值。然后使用 Object。条目
,排序
和地图
,例如:
Using reduce
, create an object with all the fruits as keys and individual sum as values. Then use Object.entries
, sort
and map
like this:
const listA = [{"apple":100}, {"banana": 50}, {"pearl": 10}, {"cherry": 5}, {"kiwi": 3}]
, listB = [{"peach": 30}, {"apple": 15}, {"kiwi": 10}, {"mango": 5}]
let merged2 = listA.concat(listB).reduce((acc, a) => {
const [k, v] = Object.entries(a)[0];
acc[k] = (acc[k] || 0) + v;
return acc;
}, {});
const final = Object.entries(merged2)
.sort(([, v1], [, v2]) => v2 - v1)
.map(([k, v]) => ({[k]: v}))
console.log(final);
这篇关于如何根据键名合并2个数组并根据合并后的值排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文