首页 > 解决方案 > 如果它们具有相同的键,我如何合并对象值?

问题描述

我有一个充满交易的数组,我想按天划分它。这将是一个日期数组和交易数组。它可能有点乱,但我想返回这个结构。

我尝试做的事情返回了我想要的结构,但我不知道如何合并重复的键值。

这是数组

const transactions = [
  {
    name: "Salário",
    receiveDate: "2020-05-12T00:00:00.000Z",
    value: "1000",
  },
  {
    name: "Pagamento ",
    receiveDate: "2020-05-12T00:00:00.000Z",
    value: "2350",
  },
  {
    name: "Passagem no VEM",
    paidDate: "2020-05-02T00:00:00.000Z",
    value: "130",
  },
  {
    name: "Almoço",
    paidDate: "2020-05-08T00:00:00.000Z",
    value: "50",
  },
];

这是我现在已经尝试过的

const days = [];
const finalArray = [];

for (let i = 0; i < transactions.length; i++) {
  transactions[i].day = transactions[i].receiveDate || transactions[i].paidDate;
  days.push(transactions[i].day);
}

const datesToMatch = [...new Set(days)].map((date) => {
  return { [date]: null };
});

transactions.map((transaction) => {
  datesToMatch.map((dayObject) => {
    const day = Object.keys(dayObject).toString();
    if (day === transaction.day) {
      finalArray.push({ [day]: [transaction] });
    }
  });
});

输出

[ { '2020-05-12T00:00:00.000Z': [ [Object] ] },
  { '2020-05-12T00:00:00.000Z': [ [Object] ] },
  { '2020-05-02T00:00:00.000Z': [ [Object] ] },
  { '2020-05-08T00:00:00.000Z': [ [Object] ] } ]

预期产出

[ { '2020-05-12T00:00:00.000Z': [ [Object, Object] ] },
  { '2020-05-02T00:00:00.000Z': [ [Object] ] },
  { '2020-05-08T00:00:00.000Z': [ [Object] ] } ]

谢谢!

标签: javascript

解决方案


解释:

  • dates: 从两个字段中提取日期
  • uniqueDates:构建一个 Set 并将其转换为一个数组,因此它只有 uniqueDates
  • dateToTransactions:将每个唯一日期映射到具有一个键(本身)的对象,并过滤与其相等的每个事务。

const transactions = [{
    name: "Salário",
    receiveDate: "2020-05-12T00:00:00.000Z",
    value: "1000",
  },
  {
    name: "Pagamento ",
    receiveDate: "2020-05-12T00:00:00.000Z",
    value: "2350",
  },
  {
    name: "Passagem no VEM",
    paidDate: "2020-05-02T00:00:00.000Z",
    value: "130",
  },
  {
    name: "Almoço",
    paidDate: "2020-05-08T00:00:00.000Z",
    value: "50",
  },
];

const dates = transactions.map(x => {
  const received = x.receiveDate || [];
  const paid = x.paidDate || [];
  return received + paid;
});

const uniqueDates = [...new Set(dates)];

const dateToTransactions =
  uniqueDates.map(
    date => {
      sameDate = transactions.filter(x => x.receiveDate === date || x.paidDate == date);
      return {[date]: sameDate}; 
    });

console.log(dateToTransactions);


推荐阅读