【问题标题】:Unable to reduce an array of objects based on string value无法根据字符串值减少对象数组
【发布时间】:2021-10-25 20:58:30
【问题描述】:

所以我有这个对象数组,我需要根据每个对象的 prop 值来减少它们并计算总数。

我的意思是,假设我有这个对象数组:

[
     { dateTime: '2021-07-30', count: 4 },
     { dateTime: '2021-07-31', count: 1 },
     { dateTime: '2021-08-01', count: 2 },
     { dateTime: '2021-08-02', count: 1 },
     { dateTime: '2021-08-03', count: 2 },
     { dateTime: '2021-08-04', count: 3 }
]

我想把它简化成这样:

[
     { month: '2021-07', count: 5 },
     { month: '2021-08', count: 8 }
]

这是sn-p:

const data = [{
    dateTime: '2021-07-30',
    count: 4
  },
  {
    dateTime: '2021-07-31',
    count: 1
  },
  {
    dateTime: '2021-08-01',
    count: 2
  },
  {
    dateTime: '2021-08-02',
    count: 1
  },
  {
    dateTime: '2021-08-03',
    count: 2
  },
  {
    dateTime: '2021-08-04',
    count: 3
  }
];

const stackedMonths = data.reduce((acc, curr) => {

  return [{
    month: curr.dateTime.slice(0, 7),
    count: acc + curr.count
  }];

}, []);

console.log(stackedMonths);

在尝试了代码之后,我得到了这个没有任何意义的:

[ { month: '2021-08', count: '[object Object]2' } ]

我在这里做错了什么?请注意,我是减少的新手,我仍在学习它。

【问题讨论】:

  • 在这一行,count: acc + curr.countacc 是一个对象。当你连接一个对象和一个数字时,你会得到一个字符串(除非你有一个返回数字的对象的 toValue 方法。)你肯定不打算把一个对象和一个数字连接起来吗?
  • 不,我没有。我正在从 SO 中的各种答案中自己尝试一下。但是 acc 不是数组吗?
  • 一个数组就是一个对象。您不能将数字添加到对象本身,因为对象不是数字(或任何形式的数字)。
  • @esqew 明白了。谢谢
  • 它应该是一个数组,但如果是,你不会得到[object Object]2。是的,数组是对象,但是数组以这种方式连接时会产生不同的结果

标签: javascript jquery arrays


【解决方案1】:

您可以使用 Array#reduce 和一个对象来存储每个月的总和。

const arr = [
     { dateTime: '2021-07-30', count: 4 },
     { dateTime: '2021-07-31', count: 1 },
     { dateTime: '2021-08-01', count: 2 },
     { dateTime: '2021-08-02', count: 1 },
     { dateTime: '2021-08-03', count: 2 },
     { dateTime: '2021-08-04', count: 3 }
];
const res = Object.values(arr.reduce((acc, curr)=>{
  const month = curr.dateTime.slice(0, -3);
  (acc[month] ??= {month, count: 0}).count += curr.count;
  return acc;
}, {}));
console.log(res);

如果month 的值还没有作为累加器上的键存在,则将其设置为{month: month, count: 0}。然后,count 会增加当前对象的计数。

【讨论】:

  • 嗨。你能解释一下这部分(acc[month] ??= {month, count: 0}).count += curr.count;吗?
  • @s.khan 如果month 的值还没有作为累加器上的键存在,则将其设置为{month: month, count: 0}。然后,计数会增加当前对象的计数。
  • Object.values??= 的使用非常巧妙,喜欢简洁。
  • @Unmitigated 嘿伙计,由于??= 运算符,我在 NodeJS 中遇到错误。
  • @s.khan 您可以将其替换为acc[month] = acc[month] || {month, count: 0}
猜你喜欢
  • 2018-04-15
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2022-01-01
  • 2014-11-15
  • 2020-08-15
相关资源
最近更新 更多