结合不同的方法来计数嵌套列表中的元素
我有一个嵌套对象,我不仅想计算每个 point_name
出现的次数,而且还想计算每个 point_name
属于多少个类别。
dat = [
{name: "Category 1", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "C"} ]},
{name: "Category 2", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "D"} ]},
{name: "Category 3", points: [ {point_name: "A"}, {point_name: "D"}, {point_name: "E"} ]},
{name: "Category 4", points: [ {point_name: "F"}, {point_name: "G"}, {point_name: "C"}, {point_name: "G"} ]},
{name: "Category 5", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "H"}, {point_name: "H"} ]}
]
所需输出
[
{name: "A", count: 4, categories: 4},
{name: "B", count: 3, categories: 3},
{name: "C", count: 2, categories: 2},
{name: "D", count: 2, categories: 2},
{name: "G", count: 2, categories: 1},
{name: "H", count: 2, categories: 1},
{name: "E", count: 1, categories: 1},
{name: "F", count: 1, categories: 1}
]
到目前为止我已经尝试过,
我使用嵌套 for 循环来获取所有 point_names
,这样我就可以在 reduce
中使用它来计算每个 point_name 的次数发生了,但是我无法弄清楚如何计算每个
point_name
所属的类别数量。
// double loop to get each point name
let counts = []
for (let i = 0; i < dat.length; i++) {
for (let j = 0; j < dat[i].points.length; j++) {
counts.push(dat[i].points[j].point_name)
}
}
// count their unique values
let uniques = counts.reduce((acc, val) => {
acc[val] = acc[val] === undefined ? 1 : acc[val] += 1;
return acc;
}, {});
// turn into array of objects
return Array(Object.keys(uniques).length)
.fill()
.map((x, i) => ({ name: Object.keys(uniques)[i], count: Object.values(uniques)[i] }))
任何帮助表示赞赏!
I have a nested object where I not only want to count the number of times each point_name
occurs, but I also want to count how many categories each point_name
is in.
dat = [
{name: "Category 1", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "C"} ]},
{name: "Category 2", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "D"} ]},
{name: "Category 3", points: [ {point_name: "A"}, {point_name: "D"}, {point_name: "E"} ]},
{name: "Category 4", points: [ {point_name: "F"}, {point_name: "G"}, {point_name: "C"}, {point_name: "G"} ]},
{name: "Category 5", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "H"}, {point_name: "H"} ]}
]
Desired Output
[
{name: "A", count: 4, categories: 4},
{name: "B", count: 3, categories: 3},
{name: "C", count: 2, categories: 2},
{name: "D", count: 2, categories: 2},
{name: "G", count: 2, categories: 1},
{name: "H", count: 2, categories: 1},
{name: "E", count: 1, categories: 1},
{name: "F", count: 1, categories: 1}
]
What I've tried so far
I used a nested for loop to get all the point_names
so I can use that in a reduce
to count how many times each point_name
occurs, but I can't figure out how to also count the number of categories each point_name
is in.
// double loop to get each point name
let counts = []
for (let i = 0; i < dat.length; i++) {
for (let j = 0; j < dat[i].points.length; j++) {
counts.push(dat[i].points[j].point_name)
}
}
// count their unique values
let uniques = counts.reduce((acc, val) => {
acc[val] = acc[val] === undefined ? 1 : acc[val] += 1;
return acc;
}, {});
// turn into array of objects
return Array(Object.keys(uniques).length)
.fill()
.map((x, i) => ({ name: Object.keys(uniques)[i], count: Object.values(uniques)[i] }))
Any help appreciated!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
转换
为
With
然后减少 with:
这给你这个:
将所有内容放在一起:
Transform
Into
With
Then reduce with:
Which gives you this:
Putting everything together:
您需要的是一个哈希表,用于保存遇到的每个类别的计数和数量。像这样的东西。
What you need is a hashtable that keeps the count and cunt of each category encountered. Something like this.