javascript - 如何在javascript中的对象数组下获取值重复的计数
问题描述
我有一个有一些重复计数的数组。我想知道那个重复的次数。我的数组是这样的:
var array = [
{ asset: "A", sector: "Hospital" },
{ asset: "B", sector: "Hardware" },
{ asset: "C", sector: "Networking" },
{ asset: "D", sector: "Networking" },
{ asset: "E", sector: "Food" },
{ asset: "F", sector: "Hospital" },
{ asset: "G", sector: "Hardware" },
{ asset: "H", sector: "Industrial" },
{ asset: "I", sector: "Transport" },
{ asset: "J", sector: "Hardware" },
{ asset: "K", sector: "Networking" },
{ asset: "L", sector: "Transport" }
]
现在我希望重复计数也像这样排序,如下所示:
final_array = [
{ sector: 'Hardware', count: 3 },
{ sector: 'Networking', count: 3 },
{ sector: 'Hospital', count: 2 },
{ sector: 'Transport', count: 2 },
{ sector: 'Food', count: 1 },
{ sector: 'Industrial', count: 1 }
]
我不知道从哪里可以做到这一点。我有很多链接,但它们解决了数组下的重复,而不是对象数组上的重复。
我使用一种方法,但这不能解决我的问题
var finalD = [];
c.forEach(x => {
if (isSectorExists(x.sector, finalD) == true) {
//Here I don't know how I will increase the counter.
} else {
finalD.push({ sector: x.sector, count: 1 });
}
});
var isSectorExists = (sector, arr) => {
return arr.some(function(el) {
return el.sector === sector;
});
};
我知道我的方法很长。是否有人有最好和最简单的方法来完成这种任务。任何帮助真的很感激。提前致谢
解决方案
您可以构建一个counts
以扇区名称作为键的对象和一个将计数存储为值的对象,遍历您的数组并更新这些计数,然后最终获取该counts
对象的值。
var array = [
{ asset: "A", sector: "Hospital" },
{ asset: "B", sector: "Hardware" },
{ asset: "C", sector: "Networking" },
{ asset: "D", sector: "Networking" },
{ asset: "E", sector: "Food" },
{ asset: "F", sector: "Hospital" },
{ asset: "G", sector: "Hardware" },
{ asset: "H", sector: "Industrial" },
{ asset: "I", sector: "Transport" },
{ asset: "J", sector: "Hardware" },
{ asset: "K", sector: "Networking" },
{ asset: "L", sector: "Transport" }
];
var counts = array.reduce((m, c) => {
if (c.sector in m) m[c.sector].count += 1;
else m[c.sector] = { sector: c.sector, count: 1};
return m;
}, {});
let finalArray = Object.values(counts).sort((a, b) => b.count - a.count);
console.log(finalArray);
这将在线性时间内获得计数(而不是调用isSectorExists
每个元素使其成为O(n^2)。