Javascript删除合并某些属性的对象列表中的副本

Ser*_*ioP 0 javascript arrays lodash ramda.js

我有这个清单:

const debts = [
  {
    amount: 10,
    debtor: "Mark",
    creditor: "John"
  },
  {
    amount: 20,
    debtor: "Mark",
    creditor: "John"
  },
  {
    amount: 10,
    debtor: "Mark",
    creditor: "Tom"
   }
];
Run Code Online (Sandbox Code Playgroud)

......我希望将这些元素与同一债务人和债权人合并计算总金额,就像这样

const debts = [
  {
    amount: 30, // 10 + 20
    debtor: "Mark",
    creditor: "John"
  },
  {
    amount: 10,
    debtor: "Mark",
    creditor: "Tom"
   }
];
Run Code Online (Sandbox Code Playgroud)

谁能帮助我?谢谢

cus*_*der 5

如果您对使用Ramda的解决方案感兴趣,请参考以下建议:

const {
  pipe,
  mergeWithKey,
  map,
  reduce,
  values,
  groupBy,
  props,
  join
} = R;

const debts = [{
    amount: 10,
    debtor: "Mark",
    creditor: "John"
  },
  {
    amount: 20,
    debtor: "Mark",
    creditor: "John"
  },
  {
    amount: 10,
    debtor: "Mark",
    creditor: "Tom"
  }
];

const mergeAmount = mergeWithKey((key, left, right) => key === 'amount' ? left + right : left);
const groupKey = pipe(props(['debtor', 'creditor']), join(' ~> '));

const process =
  pipe(
    groupBy(groupKey),
    map(reduce(mergeAmount, {})),
    values);

console.log(process(debts));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


我们的想法是将流程分为三个步骤:

  1. 集团债务人和债权人在一起
  2. 对于每个债务人/债权人组,合并金额
  3. 将每个债务人/债权人组提取到一个数组中

第1步:groupBy(groupKey)

第1步获取原始debts数组

{
    "Mark ~> John": [
        {
            amount: 10,
            creditor: "John",
            debtor: "Mark"
        },
        {
            amount: 20,
            creditor: "John",
            debtor: "Mark"
        }
    ],
    "Mark ~> Tom": [
        {
            amount: 10,
            creditor: "Tom",
            debtor: "Mark"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

第2步:map(reduce(mergeAmount,{}))

第2步获取步骤1的输出

{
    "Mark ~> John": {
        amount: 30,
        creditor: "John",
        debtor: "Mark"
    },
    "Mark ~> Tom": {
        amount: 10,
        creditor: "Tom",
        debtor: "Mark"
    }
}
Run Code Online (Sandbox Code Playgroud)

第3步:价值观

步骤3获取步骤2的输出

[
    {
        amount: 30,
        creditor: "John",
        debtor: "Mark"
    },
    {
        amount: 10,
        creditor: "Tom",
        debtor: "Mark"
    }
]
Run Code Online (Sandbox Code Playgroud)

  • 您可以将`map(reduce(mergeAmount,{amount:0}))`转换为`map(reduce(mergeAmount,{}))`因为如果两个`mergeWithKey`中都不存在该键,则不使用回调. (2认同)