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

我对 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 ...未定义...


有人可以好心地向我解释如何理解这些废话吗?


万千封印
浏览 105回答 2
2回答

Helenr

你可以使用reduceconst 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)

慕村9548890

你的开始不错。但是,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));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript