работа с обьектом в обьекте js

Друзья, нужна помощь в том, чтобы разобраться, как работать с несколькими обьектами, а то я полностью запутался и не понимаю, что и как нужно делать. Итак, есть у меня обьект:

let HERO = {
   name: '',
   age: 0,
   gender: 0,
}

есть другой обьект:

let PARTY = {
   qualyty: [],
   men: 0,
   woman: 0,
}

PARTY.qualyty[0] = HERO;

И вот какая фигня, как сделать так, чтобы при добавление в массив PARTY.qualyty обьекта HERO, параметры PARTY.man и PARTY.woman считались автоматические опираясь на свойство gender обекта HERO? Я навоял функцию, которая будет производить расчеты, но понятия не имею, куда ее приткнуть, чтобы она работала автоматом и делала перерасчет при добавлении новых элементов в массив:

function Counter() {
      var result = 0;
      for (var i = 0; i < PARTY.qualyty.length; i++) {
        if (PARTY.qualyty[i].gender == 1) {
          result = result + 1;
        }
        return result;
      }

Как это можно реализовать? Чтобы не приходилось вызывать функцию каждый раз при добавлении нового обьекта HERO в PARTY.qualyty?

=====

С учетом Ваших подсказок и разьяснений, сделал следующий обьект:

let PEOPLE = {
    gender: 0,
    fraction: 0,
    race: 0,
    age: 0,
    socialStats: 0,
    work: 0,
};

let CASTLE = {
  social: {
    peopleTotal: [],
    freeMen: 0,
    freeFemale: 0,
    slaveMen: 0,
    slaveFemale: 0,
    children: 0,
    happy: 100,
    addPeople(people) {
      console.log('people', people);
      if (CASTLE.social.peopleTotal.length > 0) {
        for (var i = 0; i < CASTLE.social.peopleTotal.length; i++) {
          if (people.gender == 0 && people.socialStats == 1) {
            CASTLE.social.freeMen += 1;
          } else if (people.gender == 0 && people.socialStats == 0) {
            CASTLE.social.slaveMen += 1;
          } else if (people.gender == 1 && people.socialStats == 1) {
            CASTLE.social.freeFemale += 1;
          } else if (people.gender == 1 && people.socialStats == 0) {
            CASTLE.social.slaveFemale += 1;
          }
        }
      }

    }
  },
  laws: {
    taxes: 0,
    slavery: 0,
    drinking: 0,
  }
};

Но когда пытаюсь выполнить присвоение обьекта PEOPLE нулевому элементу массива CASTLE.social.peopleTotal, то соответствующие счетчики не обновляются, то есть функция либо не работает вообще, либо работает, но не правильно:

function getRandom(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min; //Максимум и минимум включаются
}

CASTLE.social.peopleTotal[0] = Object.assign({}, PEOPLE, { gender: getRandom(0, 1), fraction: getRandom(0, 6), race: getRandom(0, 4), age: getRandom(5, 60), socialStats: getRandom(0, 1), work: 0})
console.log('human: ', CASTLE.social.peopleTotal[0]);
console.log('free male: ', CASTLE.social.freeMen);
console.log('free female: ', CASTLE.social.freeFemale);
console.log('slave man: ', CASTLE.social.slaveMen);
console.log('slave female: ', CASTLE.social.slaveFemale);

Ответы (1 шт):

Автор решения: Grundy

В примере в вопросе объекты просто хранят данные. Поэтому все поля нужно обновлять самому

PARTY.qualyty[0] = HERO;
if (HERO.gender == 0){
    PARTY.men += 1;
}else{
    PARTY.woman += 1;
}

Чтобы не писать это каждый раз, достаточно перенести этот код в метод объекта PARTY

let PARTY = {
   qualyty: [],
   men: 0,
   woman: 0,
   addQualyty(){
      PARTY.qualyty[0] = HERO;
      if (HERO.gender == 0){
          PARTY.men += 1;
      }else{
          PARTY.woman += 1;
      }       
   }
}

Чтобы сделать более универсально, нужно вынести в параметр добавляемый объект, и заменить упоминание объекта PARTY на this:

addQualyty(hero){
   this.qualyty.push(hero);
   if (hero.gender == 0){
       this.men += 1;
   }else{
       this.woman += 1;
   }       
}
→ Ссылка