Как подсчитать количество уникальных элементов в массиве объектов, используя свойство object?

#javascript #arrays #iteration

Вопрос:

У меня есть массив, который выглядит следующим образом:

 let arr = [  {'option1':1},{'option1':1},{'option1':1},  {'option1':2},{'option1':2},  {'option1':3},  {'option2':1},{'option2':1} ]   

Мне нужно выполнить итерацию по массиву и подсчитать вхождения каждого элемента с одним и тем же свойством, которое будет отображаться следующим образом:

 option1:{  1:3,  2:2,  3:1,  },  option2:{  1:2,  }  

В основном говорят, что опция 1 со свойством 1 имеет 3 отсчета, опция 1 со свойством 2 имеет 2 отсчета, опция 1 со свойством 3 имеет 1 отсчет и так далее.

Комментарии:

1. Есть ли какое-либо отношение к тому, как вы сгруппировали элементы массива в разных строках? Я спрашиваю, потому что в JavaScript разрывы строк не имеют значения между элементами массива. Массив одинаков, если он записан с каждым элементом в одной строке или с ними в отдельных строках. Кроме того, логика, лежащая в основе ожидаемого результата, довольно неясна. Пожалуйста, объясните логические шаги, необходимые для получения ожидаемого результата от отображаемых вами данных.

2. привет @tao, нет никакого отношения к тому, как я сгруппировал массив по этому вопросу. Я сделал это только для того, чтобы яснее видеть массив. Я обновил вопрос, чтобы лучше объяснить результат

3. Ваш option1 счет был 1:3, 2:1, 3:1 до редактирования. Теперь ясно, чего ты хочешь.

Ответ №1:

таким образом…

 let arr =   [ { option1: 1 }, { option1: 1 }, { option1: 1 }   , { option1: 2 }, { option1: 2 }   , { option1: 3 }   , { option2: 1 }, { option2: 1 }   ]   let obj = arr.reduce((r,o)=gt;  {  let [name,num] = Object.entries(o)[0]   if (!r[name]) r[name] = {}  if (!r[name][num]) r[name][num] = 1  else r[name][num]    return r  },{})  console.log( obj ) 
 .as-console-wrapper { max-height: 100% !important; top: 0 }