【问题标题】:How can I merge object values if they have the same key?如果它们具有相同的键,我如何合并对象值?
【发布时间】:2020-05-02 10:01:39
【问题描述】:

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

我尝试执行的操作返回了我想要的结构,但我不知道如何合并重复的键值。

这是数组

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

谢谢!

【问题讨论】:

  • 您想将日期值转换为键,并且每个键(日期)都有一个包含名称和值的数组吗?
  • 您似乎想group the objects,但方式有点奇怪。

标签: javascript


【解决方案1】:

解释:

  • 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);

【讨论】:

  • 太棒了!谢谢你的解释。
【解决方案2】:

我会这样做:

const days = [];

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

const result = new Map();
days.forEach((day) => {
  result.set(day, [])
});

transactions.forEach((transaction) => {
  let r = result.get(transaction.day);
  r.push(transaction);
  result.set(transaction.day, r);
});

然后,在result 地图中,您会看到每天进行的交易的列表。

【讨论】:

  • 谢谢,伙计!非常感谢您的帮助,这正是我所需要的。
  • 没问题,乐于助人!
【解决方案3】:

这将给出您期望的结果

const days = {};

const finalArray = transactions.forEach((transaction) => {
          let date = (transaction.receiveDate || transaction.paidDate)
          if (!days[date]) { days[date] = [transaction]}
          else {days[date].push(transaction)}
          });
console.log(days);

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多