работа с обьектом в обьекте 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 шт):
В примере в вопросе объекты просто хранят данные. Поэтому все поля нужно обновлять самому
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;
}
}