У меня есть такой массив объектов:
const dataset = [
{name: 'Paul', age: 10},
{name: 'Marcus', age: 5},
{name: 'Jennifer', age: 1},
{name: 'Linda', age: 53},
{name: 'Mary', age: 4},
{name: 'Rose', age: 40},
{name: 'Peter', age: 2},
]
и массив диапазонов:
const buckets = [[0, 10], [10, 20], [20, 30], [30, 60]]
Вот что хотелось бы получить:
const result = {
"0-10": {
res: [{name: 'Marcus', age: 5}, {name: 'Jennifer', age: 1}, {name: 'Mary', age: 4}, {name: 'Peter', age: 2}],
count: 4
},
"10-20": {res: [{name: 'Paul', age: 10}], count: 1},
"20-30": {res: [], count: 0},
"30-60": {res: [{name: 'Linda', age: 53}, {name: 'Rose', age: 40}], count: 2},
}
Поэтому я хотел бы получить объект, в котором каждый ключ представляет собой диапазон ведра (в виде строки), а каждое значение — это объект, содержащий две информации: res
должен быть массив людей, чьи age
внутри этого ведра (min <= age < max
) и count
— длина этого массива.
Вот мой код:
const res = buckets.reduce((acc, bucketExtent) => {
const keyBucket = `${bucketExtent[0]}-${bucketExtent[1]}`
const people = dataset.filter(
(s) => s['age'] >= bucketExtent[0] && s['age'] < bucketExtent[1]
)
acc[keyBucket] = {
res: people,
count: people.length,
}
return acc
}, {})
Это работает, но есть способ поумнее? Я предпочитаю не зацикливаться каждый раз, когда dataset
массив, потому что он будет очень большим
1 ответ
Из небольшого обзора;
- Вы определенно перебираете каждую запись 4 раза
- Это принадлежит хорошо названной функции
- В остальном это очень просто и понятно.
Я думал, что люди не живут так долго, можно легко построить справочную таблицу для каждого возможного возраста. Это может немного ускорить процесс.
Итак, что-то вроде этого;
const dataset = [
{name: 'Paul', age: 10},
{name: 'Marcus', age: 5},
{name: 'Jennifer', age: 1},
{name: 'Linda', age: 53},
{name: 'Mary', age: 4},
{name: 'Rose', age: 40},
{name: 'Peter', age: 2},
]
const buckets = [[0, 10], [10, 20], [20, 30], [30, 60]]
function createAgeBuckets(dataset, buckets){
const start = 0, end = 1;
const out = {}, ages = [];
//Create age range
for(const bucket of buckets){
bucketRange = `${bucket[start]}-${bucket[end]}`;
out[bucketRange] = {res: [], count: 0};
for(let age = bucket[start]; age < bucket[end];age++){
ages[age] = out[bucketRange];
}
}
//Create bucketses
dataset.forEach(person => {
ages[person.age].res.push(person);
ages[person.age].count++;
});
return out;
}
console.log(createAgeBuckets(dataset, buckets));