gpt4 book ai didi

javascript - 在对象数组中创建唯一列表和数组项计数

转载 作者:行者123 更新时间:2023-12-01 00:36:29 28 4
gpt4 key购买 nike

我有以下源数组:

const list = [
{
students: [ 'peter', 'bob', 'john']
},
{
students: [ 'thomas', 'sarah', 'john']
},
{
students: [ 'john', 'sarah', 'jack']
}
];

我想获得唯一的学生姓名及其数量,最终结果应该是这样的:

{
'john': 3,
'sarah': 2,
'thomas': 1,
'jack': 1,
'peter': 1,
'bob': 1
}

这是我的尝试:

const unique = list.reduce(function(total, curr){
const students = curr.students;
for (c of students) {
if (!total[c]) {
total[c] = 1
} else {
total[c] += 1;
}
}
return total;

}, {});

有更好的方法吗?或者更快更干净的方式?谢谢

最佳答案

我首先将数组展平,然后用 reduce 进行计数:

const list = [
{
students: [ 'peter', 'bob', 'john']
},
{
students: [ 'thomas', 'sarah', 'john']
},
{
students: [ 'john', 'sarah', 'jack']
}
];


const allStudents = list.flatMap(({ students }) => students);
const count = allStudents.reduce((a, name) => {
a[name] = (a[name] || 0) + 1;
return a;
}, {});
console.log(count);

如果您还希望对属性进行排序,请选择 Object.entries的对象,对其进行排序,然后将其转回对象 Object.fromEntries :

const list = [
{
students: [ 'peter', 'bob', 'john']
},
{
students: [ 'thomas', 'sarah', 'john']
},
{
students: [ 'john', 'sarah', 'jack']
}
];


const allStudents = list.flatMap(({ students }) => students);
const count = allStudents.reduce((a, name) => {
a[name] = (a[name] || 0) + 1;
return a;
}, {});
const sorted = Object.fromEntries(
Object.entries(count).sort((a, b) => b[1] - a[1])
);
console.log(sorted);

如果您的环境不支持 flatMap 或 fromEntries,请使用 polyfill,或使用不同的方法展平/分组:

const list = [
{
students: [ 'peter', 'bob', 'john']
},
{
students: [ 'thomas', 'sarah', 'john']
},
{
students: [ 'john', 'sarah', 'jack']
}
];


const allStudents = [].concat(...list.map(({ students }) => students));
const count = allStudents.reduce((a, name) => {
a[name] = (a[name] || 0) + 1;
return a;
}, {});
const sortedEntries = Object.entries(count).sort((a, b) => b[1] - a[1]);
const sortedObj = sortedEntries.reduce((a, [prop, val]) => {
a[prop] = val;
return a;
}, {});
console.log(sortedObj);

请记住,对象属性顺序仅在 ES6+ 环境中指定。而Object.fromEntries规范并不能保证以与条目相同的顺序创建对象,但幸运的是,在我遇到的任何实现中,无论如何它都会这样做。 (如果您仍然担心,可以使用老式的 reduce 方法来创建对象,就像第三个片段中一样)

关于javascript - 在对象数组中创建唯一列表和数组项计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com