假设我有两个列表
const listA = [{"apple":100}, {"banana": 50}, {"pearl": 10}, {"cherry": 5}, {"kiwi": 3}]
const listB = [{"peach": 30}, {"apple": 15}, {"kiwi": 10}, {"mango": 5}]
问题是如何将两个列表合并到同一项目中,且编号递增,并按数量排序?我的意思是最终结果应该是->
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
})
}
但是不确切地知道如何叠加数字,只能按数量排序。
答案 0 :(得分:2)
您可以像这样使用reduce
,sort
和Object.values
:
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.entries
,sort
和map
:
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);
答案 1 :(得分:1)
您可以使用TableSections
遍历第二个列表,并使用forEach
检查第一列表中是否存在相同的元素。如果该元素不存在(-1),则将该元素推入第一个列表。如果存在,则使用索引获取该对象,然后在findIndex
for..in
答案 2 :(得分:1)
我认为我的代码比 brk
的代码更简洁const listA = [{"apple":100}, {"banana": 50}, {"pearl": 10}, {"cherry": 5}, {"kiwi": 3}]
const listB = [{"peach": 30}, {"apple": 15}, {"kiwi": 10}, {"mango": 5}]
const both = Object.assign({}, ... listA, ... listB); // concatenate both lists and convert them to an object
const lA = Object.assign({}, ...listA); // convert listA to an object
const lB = Object.assign({}, ...listB);
var result = Object.keys(both).map( (a) => { // mapping sums the values and yields an array
var sum = {};
sum [a] =(lA[a] ? lA[a] : 0) + (lB[a] ? lB[a] : 0);
return sum;
});
// sorting in desc order (hence b - a ) based on values (hence b[Object.keys(b)]) rather than keys
result.sort((a,b) => b[Object.keys(b)] - a[Object.keys(a)] );
之所以复杂,是因为您将值存储为数组。
我相信这不是最好的方法,因为数组可以有多个具有相同键的元素。例如。您可以得到如下所示的结果:
const listA = [{"apple":100},...,{"apple":10}]
有效,但可能会引起问题。
我建议您考虑将其用作对象,例如:
const listA = {{'apple': 100}, {'banana':50}}
这将大大简化代码,并确保您没有重复
希望有帮助!