Javascript: более краткий способ уменьшить / агрегировать по ключу? - PullRequest
0 голосов
/ 29 июня 2019

Этот код дает ожидаемый результат, но есть ли более краткий способ достижения того же результата?Это просто вопрос любопытства.

Цель состоит в том, чтобы иметь карту, отображающую общее количество учащихся в каждой школе, а также карту, отображающую общее количество учителей в каждой школе.

// Example data
const studentsMap = {
    student123: {
        teacher: 'teacher123'
    },
    student456: {
        teacher: 'teacher123'
    },
    student789: {
        teacher: 'badID'
    },
    student000: {}
};
const teachersMap = {
    teacher123: {
        school: 'school123'
    },
    teacher456: {
        school: 'school123'
    },
    teacher789: {
        school: 'school456'
    }
};

const studentsTotalBySchool = Object.keys(studentsMap).reduce((totals, key) => {
    const current = studentsMap[key];
    if (!teachersMap[current.teacher] || !teachersMap[current.teacher].school) {
        return totals;
    }
    totals[teachersMap[current.teacher].school] = (totals[teachersMap[current.teacher].school] || 0) + 1;
    return totals;
}, {});

const teachersTotalBySchool = Object.keys(teachersMap).reduce((totals, key) => {
    const current = teachersMap[key];
    totals[current.school] = (totals[current.school] || 0) + 1;
    return totals;
}, {});

Есть ли способ написать это более кратко, не жертвуя слишком большой читабельностью?

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы можете использовать Object.entries и деструктурировать так:

const studentsTotalBySchool = Object.entries(studentsMap).reduce((totals, [key, { teacher }) => {
    if (!teachersMap[teacher] || !teachersMap[teacher].school) return totals;
    totals[teachersMap[teacher].school] = (totals[teachersMap[teacher].school] || 0) + 1;
    return totals;
}, {});

const teachersTotalBySchool = Object.entries(teachersMap).reduce((totals, [key, { school }) => {
    totals[school] = (totals[school] || 0) + 1;
    return totals;
}, {});
0 голосов
/ 29 июня 2019

это даст вам те же результаты с гораздо меньшим кодом

 let schools = {
  school123: {
    teacher123 : {
      students: ["student123", "student456"]
    },
    teacher456 : {
      students: ["student789"]
    }
  },
  school456: {
    teacher123 : {
      students: ["student123", "student456"]
    },
    teacher456 : {
      students: ["student789"]
    }
  }
};

function findTotal(school, totalOf){

  let accumulated = 0;

  switch(totalOf){

    case "students":
      for(let teachers of Object.keys(schools[school])){
        accumulated += schools[school][teachers].students.length;
      }
      break;

    case "teachers":
    accumulated = Object.keys(schools[school]).length;

  }

  return accumulated;

}
console.log(findTotal("school123", "students"))
console.log(findTotal("school123", "teachers"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...