Я думаю, что вам лучше всего подойдет вспомогательный объект. Первоначально вспомогательный объект будет пустым, но он будет постепенно заполняться тем, что вы читаете. Я собираюсь предположить, что ключи в вашем массиве непротиворечивы.
const keys = ["Name","Type"]
var counterObj = {}
let keyForCounterObj
arrayOfObjects.forEach((obj)=>{
keyForCounterObj = ''
keys.forEach((key)=>{
keyForCounterObj += String(obj[key])
}
if(counterObj[keyForCounterObj]){
counterObj[keyForCounterObj].times ++
}else{
counterObj[keyForCounterObj] = {
...obj,
times:1
}}}
Давайте разберем это, потому что я понимаю, что это может быть немного запутанным, если вы никогда не видели эту настройку раньше.
Мы перебираем каждый объект в массиве и строим ключ на основе всех значений, которые хранит этот объект. Например, arrayOfObjects [0] создаст ключ «AppleFruit». (Я использую метод String () на всякий случай, когда он применяется к объекту, имеющему только целочисленные значения или значения с плавающей запятой, поскольку они недопустимы для создания ключа в javaScript. Это не обязательно для вашего конкретного вопроса)
Получив этот ключ, мы проверяем, существует ли он в нашем counterObject. Если его не существует, мы его определяем. Мы устанавливаем атрибут "times" в 1, потому что мы только что создали этот объект;его бы не было, если бы мы его не нашли.
Если объект уже существует, мы просто увеличиваем атрибут «times». В конце у нас есть объект, который выглядит следующим образом:
counterObj = {
AppleFruit: {
Name:"Apple",
Type:"Fruit",
times:3,
},
CarrotVegetable:{
Name:"Carrot",
Type:"Vegetable",
times:4,
}
}
Хорошо, теперь у нас есть объект объектов. Давайте превратим это в массив!
let newArrayOfObjects = []
const counterObjKeys = Object.keys(counterObj)
counterObjKeys.forEach((key)=>{
newArrayOfObjects.push(counterObj[key])
}
Это вернет окончательное значение в указанном вами формате!