首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对特定属性具有相同值的元素进行计数,并将结果放入对象数组中

对特定属性具有相同值的元素进行计数,并将结果放入对象数组中
EN

Stack Overflow用户
提问于 2017-01-21 05:33:04
回答 3查看 67关注 0票数 2

使用Array.reduce,我尝试计算对于特定属性具有相同值的元素。我希望将结果放在一个对象数组中,其中包含一个属性用于按属性分组的值,另一个用于计数。我如何在javascript中轻松地做到这一点呢?

代码语言:javascript
代码运行次数:0
运行
复制
const CATEGORY = {
  STRATEGY: 'STRATEGY',
  CONTENT: 'CONTENT',
  ADVERTISING: 'ADVERTISING',
  MEASURMENT: 'MEASURMENT'
}

const lessons = [
  {
    title: 'ohoho',
    category: CATEGORY.STRATEGY
  }, {
    title: 'hihihi',
    category: CATEGORY.CONTENT
  }, {
    title: 'hello',
    category: CATEGORY.CONTENT
  }
]

let categoryLessonCount = lessons.reduce(function (acc, lesson) {
  acc[lesson.category] ? acc[lesson.category]++ : acc[lesson.category] = 1
  return acc
}, {})
console.log(categoryLessonCount[CATEGORY.STRATEGY])
console.log(categoryLessonCount[CATEGORY.CONTENT])
代码语言:javascript
代码运行次数:0
运行
复制
Actual categoryLessonCount value : 

代码语言:javascript
代码运行次数:0
运行
复制
Object
{
  STRATEGY: 1, 
  CONTENT: 2
}

想要的categoryLessonCount值:

代码语言:javascript
代码运行次数:0
运行
复制
Array
[ 
  {
   title: 'STRATEGY', 
   count: 1
  }, {
   title: 'CONTENT', 
   count: 2
  } 
]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-21 05:47:19

你已经得到了你想要的,只需将它转换成一个数组

代码语言:javascript
代码运行次数:0
运行
复制
const CATEGORY = {
  STRATEGY: 'STRATEGY',
  CONTENT: 'CONTENT',
  ADVERTISING: 'ADVERTISING',
  MEASURMENT: 'MEASURMENT'
}

const lessons = [{
  title: 'ohoho',
  category: CATEGORY.STRATEGY
}, {
  title: 'hihihi',
  category: CATEGORY.CONTENT
}, {
  title: 'hello',
  category: CATEGORY.CONTENT
}]

let count = lessons.reduce(function(acc, lesson) {
  acc[lesson.category] ? acc[lesson.category] ++ : acc[lesson.category] = 1
  return acc
}, {})

// transform count into what you want
let categoryLessonCount = [];
for (let cat in count) {
  categoryLessonCount.push({
    'title': cat,
    'count': count[cat]
  });
}

console.log(categoryLessonCount)

票数 1
EN

Stack Overflow用户

发布于 2017-01-21 05:46:18

像这样的东西应该是有效的:

代码语言:javascript
代码运行次数:0
运行
复制
let categoryLessonCount = lessons.reduce(function(acc, lesson) {
  let found = false
  for (const item of acc) {
    if (item.title === lesson.category) {
      item.count++
      found = true
    }
  }

  if (!found) {
    acc.push({
      title: lesson.category,
      count: 1
    })
  }

  return acc
}, [])

您的主要问题是您累积了一个对象,但需要一个数组(请注意reduce的最后一个参数)。

票数 1
EN

Stack Overflow用户

发布于 2017-01-21 06:02:57

使用Object.keysArray.prototype.map函数的简短解决方案:

代码语言:javascript
代码运行次数:0
运行
复制
...
let categoryLessonCount = lessons.reduce(function (acc, lesson) {
  acc[lesson.category] ? acc[lesson.category]++ : acc[lesson.category] = 1
  return acc
}, {})

let counts = Object.keys(categoryLessonCount).map(
  (k) => ({title: k, count: categoryLessonCount[k]})
)

console.log(counts);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41772685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档