如何根据键名合并2个数组并根据合并后的值排序?

时间:2019-01-15 07:15:22

标签: javascript reactjs sorting react-native bubble-sort

假设我有两个列表

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
    })
  }

但是不确切地知道如何叠加数字,只能按数量排序。

3 个答案:

答案 0 :(得分:2)

您可以像这样使用reducesortObject.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.entriessortmap

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}} 这将大大简化代码,并确保您没有重复

希望有帮助!