#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 }