React JS 排序和堆叠列表值

React JS Sorting and Stacking list value

假设

const listA = [{"key":"apple", "value":100}, {"key":"banana", "value":50}, {"key":"pearl", "value":10}, {"key":"cherry", "value":5}, {"key":"kiwi", "value":3}]
const listB = [{"key":"peach", "value":30}, {"key":"apple", "value":15}, {"key":"kiwi", "value":10}, {"key":"mango", "value":5}]

如你所见,在数组中它得到了每个对象对 "key " 和 "value",我希望在新构建列表中叠加相同键的值,新构建列表还需要按值降序排列,例如这样的东西 ->

const listMerged = [{"key":"apple", "value":115}, {"key":"banana", "value":50} , {"key":"peach", "value":30}, {"key":"kiwi", "value":13}, {"key":"pearl", "value":10}, {"key":"cherry", "value":5}, {"key":"mango", "value":5}]

刚刚试过类似的东西 ->

let newArr = listB.forEach((item) => {

  let ifElemPresentInListA = listA.findIndex((elem) => {
    return Object.keys(elem)[0] === Object.keys(item)[0]
  })

  if (ifElemPresentInListA === -1) {
    listA.push(item)
  } else {
    for (let keys in listA[ifElemPresentInListA]) {
      listA[ifElemPresentInListA][keys] += Object.values(item)[0]
    }
  }

})    

但是结果有点乱

如果有人能提出更好的代码示例,那就太好了。谢谢

这是一个可能的解决方案,它连接列表,按键排序,然后遍历 concatenated/sorted 数组以有条件地在新列表中添加或递增。

const listA = [{"key":"apple", "value":100}, {"key":"banana", "value":50}, {"key":"pearl", "value":10}, {"key":"cherry", "value":5}, {"key":"kiwi", "value":3}]
const listB = [{"key":"peach", "value":30}, {"key":"apple", "value":15}, {"key":"kiwi", "value":10}, {"key":"mango", "value":5}]

let lists = [];

listA.concat(listB).sort((a, b) => a.key > b.key).forEach(el => {
  if (lists.length > 0 && lists[lists.length - 1].key === el.key) {
    lists[lists.length - 1].value += el.value;
  } else {
    lists.push(el);
  }
});

console.log(lists.sort((a, b) => b.value - a.value));

您可以将两个数组压缩到对象中以对匹配键的值求和,然后从对象创建数组:

const listA = [{"key":"apple", "value":100}, {"key":"banana", "value":50}, {"key":"pearl", "value":10}, {"key":"cherry", "value":5}, {"key":"kiwi", "value":3}];
const listB = [{"key":"peach", "value":30}, {"key":"apple", "value":15}, {"key":"kiwi", "value":10}, {"key":"mango", "value":5}];

let result = [...listA, ...listB].reduce((acc, item) => {
  acc[item.key] = acc[item.key] ? acc[item.key] + item.value : item.value
  return acc;
}, {});

result = Object.entries(result)
  .map(([key, value]) => ({ key, value }))
  .sort((a, b) => b.value - a.value);

console.log(result);

您可以使用 Map 收集所有 key/value 对,然后对新数组进行排序。

const
    listA = [{ key: "apple", value: 100 }, { key: "banana", value: 50 }, { key: "pearl", value: 10 }, { key: "cherry", value: 5 }, { key: "kiwi", value: 3 }],
    listB = [{ key: "peach", value: 30 }, { key: "apple", value: 15 }, { key: "kiwi", value: 10 }, { key: "mango", value: 5 }],
    result = Array
        .from(
            [...listA, ...listB].reduce((m, { key, value }) => m.set(key, (m.get(key) || 0) + value), new Map),
            ([key, value]) => ({ key, value })
        )
        .sort(({ key: a }, { key: b }) => a.localeCompare(b));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }