Поместите каждый объект в указанное ведро

У меня есть такой массив объектов:

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 ответ
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));

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *