Вы можете уменьшить данные до объекта, который содержит счетчик каждого элемента, проиндексированного строковым элементом.Затем, если не существует достаточно большого количества уникальных объектов, вы можете sort
записей по их количеству появлений, а затем нарезать первые 10.
var jsonData = [
{
"id": "5",
"name": "#5"
},
{
"id": "1",
"name": "#1"
},
{
"id": "2",
"name": "#2"
},
{
"id": "8",
"name": "#8"
},
{
"id": "1",
"name": "#1"
},
{
"id": "10",
"name": "#10"
},
{
"id": "2",
"name": "#2"
}];
const counts = jsonData.reduce((a, obj) => {
const string = JSON.stringify(obj);
a[string] = (a[string] || 0) + 1
return a;
}, {});
const result = Object.entries(counts)
.sort((a, b) => b[1] - a[1])
.slice(0, 10)
.map(([string, count]) => ({ count, obj: JSON.parse(string) }));
console.log(result);
Чтобы добавить счетчики к исходным данным, выполните итерации по данным после создания объекта counts
:
var jsonData = [
{
"id": "5",
"name": "#5"
},
{
"id": "1",
"name": "#1"
},
{
"id": "2",
"name": "#2"
},
{
"id": "8",
"name": "#8"
},
{
"id": "1",
"name": "#1"
},
{
"id": "10",
"name": "#10"
},
{
"id": "2",
"name": "#2"
}];
const counts = jsonData.reduce((a, obj) => {
const string = JSON.stringify(obj);
a[string] = (a[string] || 0) + 1
return a;
}, {});
jsonData.forEach((item) => {
item.count = counts[JSON.stringify(item)];
});
console.log(jsonData);