为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 按倍数分组并在新字段中计数

Javascript 按倍数分组并在新字段中计数

万千封印 2023-04-14 16:19:41
我对 JS 如此可笑地迷失了......我一直在尝试几个小时来做一些在 R 或 Python 中需要 5 秒才能完成的事情。努力学习只是为了这一项作业。可以说我有一个这样的对象:myObject = [ {'location': 'california', 'day': 'wednesday', 'company': 'Tesla'},             {'location': 'washington', 'day': 'tuesday', 'company': 'Microsoft'},             {'location': 'california', 'day': 'wednesday', 'company': 'Tesla'},             {'location': 'california', 'day': 'monday', 'company': 'Apple'},             {'location': 'california', 'day': 'monday', 'company': 'SalesForce'}             {'location': 'washington', 'day': 'tuesday', 'company': 'Microsoft'},             {'location': 'california', 'day': 'wednesday', 'company': 'Apple'}            ]我想按地点和日期分组,计算不同公司的数量并得到如下输出:myOutputObject = [ {'location': 'california', 'day': 'wednesday', 'count':2},                   {'location': 'washington', 'day': 'tuesday', 'count':1},                   {'location': 'california', 'day': 'monday', 'count':2}                 ]来自 python 背景的 JS 对我来说是一个噩梦。我尝试在每个元素中创建一个“计数”键并将其设置为 0 以这样开始:var dataset = []dataset = data.forEach(function(d){     d['count'] = 0;     return d})console.log(dataset);什么都没有...zilch ...未定义...有人可以好心地向我解释如何理解这些废话吗?
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

你可以使用reduce


const myObject = [

  { location: 'california', day: 'wednesday', company: 'Tesla' },

  { location: 'washington', day: 'tuesday', company: 'Microsoft' },

  { location: 'california', day: 'wednesday', company: 'Tesla' },

  { location: 'california', day: 'monday', company: 'Apple' },

  { location: 'california', day: 'monday', company: 'SalesForce' },

  { location: 'washington', day: 'tuesday', company: 'Microsoft' },

  { location: 'california', day: 'wednesday', company: 'Apple' }

]


const res = myObject.reduce((acc, obj) => {

  const existingIndex = acc.findIndex(

    el => el.location === obj.location && el.day === obj.day

  )

  if (existingIndex > -1) {

    acc[existingIndex].count += 1

  } else {

    acc.push({

      location: obj.location,

      day: obj.day,

      count: 1

    })

  }

  return acc

}, [])


console.log(res)


查看完整回答
反对 回复 2023-04-14
?
慕村9548890

TA贡献1884条经验 获得超4个赞

你的开始不错。但是,Array.forEach[ docs ] 返回undefined(+您实际上是在更新原始对象而不是添加到新对象中)。所以要修复你的开始,你必须做:

var myOutputObject = [];
myObject.forEach(function(d) {
  myOutputObject.push({...d, count: 0});
})console.log(myOutputObject);

让我们制定一个没有二次时间复杂度的解决方案:

const myObject = [

  {location: 'california', day: 'wednesday', company: 'Tesla'},

  {location: 'washington', day: 'tuesday', company: 'Microsoft'},

  {location: 'california', day: 'wednesday', company: 'Tesla'},

  {location: 'california', day: 'monday', company: 'Apple'},

  {location: 'california', day: 'monday', company: 'SalesForce'},

  {location: 'washington', day: 'tuesday', company: 'Microsoft'},

  {location: 'california', day: 'wednesday', company: 'Apple'},

];


const m = new Map();

myObject.forEach(({day, location}) => {

  // Create a key with values that we want to group by

  // A list of key-value pairs is chosen to make use of `Object.fromEntries` later

  const hash = JSON.stringify([['day', day], ['location', location]]);

  m.set(hash, (m.get(hash) || 0) + 1);

});

const myOutputObject = [...m].map(([rec, count]) => ({

  ...Object.fromEntries(JSON.parse(rec)),

  count,

}))

console.log(JSON.stringify(myOutputObject));


查看完整回答
反对 回复 2023-04-14
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信