Вы можете определить массив ключей, который вы хотите посчитать, а затем использовать метод reduce
с вложенным forEach
l oop на Object.entries
и подсчитать встречающиеся значения для каждого из этих определенных ключей.
const data = [
{'year': 2019, 'a_academic': 3, 'f_security': 4, 'k_services': 3},
{'year': 2019, 'a_academic': 2, 'f_security': 2, 'k_services': 4},
{'year': 2019, 'a_academic': 3, 'f_security': 3, 'k_services': 1},
{'year': 2019, 'a_academic': 3, 'f_security': 3, 'k_services': 3},
]
const props = ['a_academic', 'f_security', 'k_services']
const result = data.reduce((r, e) => {
Object.entries(e).forEach(([k, v]) => {
if (props.includes(k)) {
if (!r[k]) r[k] = {}
r[k][v] = (r[k][v] || 0) + 1
}
})
return r;
}, {})
console.log(result)
Чтобы заполнить пустые значения в каждом объекте, вы должны сначала найти минимальное и максимальное значения для всех данных, но также и для только определенных реквизитов.
const data = [
{'year': 2019, 'a_academic': 3, 'f_security': 4, 'k_services': 3},
{'year': 2019, 'a_academic': 2, 'f_security': 2, 'k_services': 4},
{'year': 2019, 'a_academic': 3, 'f_security': 3, 'k_services': 1},
{'year': 2019, 'a_academic': 3, 'f_security': 3, 'k_services': 3},
]
const props = ['a_academic', 'f_security', 'k_services']
const values = data.map(e => {
return Object.entries(e)
.filter(([k]) => props.includes(k))
.map(([k, v]) => v)
}).flat()
const max = Math.max(...values)
const min = Math.min(...values)
const result = data.reduce((r, e) => {
Object.entries(e).forEach(([k, v]) => {
if (props.includes(k)) {
if (!r[k]) {
r[k] = {}
for (let i = min; i <= max; i++) {
r[k][i] = 0
}
}
r[k][v] += 1
}
})
return r;
}, {})
console.log(result)