Объект как словарь. Не понятна теория

var catsFavoriteFood = {
‘Кекс’: ‘рыба’,
‘Рудольф’: ‘котлета’,
‘Снежок’: ‘сметана’
};

var printFavoriteFood = function (name) {
return 'Моя любимая еда — ’ + catsFavoriteFood[name];
};

console.log(printFavoriteFood(‘Снежок’));
// Выведет: Моя любимая еда — сметана

Меня интересует этот момент: catsFavoriteFood[name];
Откуда в обьекте информация что именно первый параметр это name? ведь мы это нигде не прописывали. Вообще нет обращения к name, как к структуре ключ=значение. Надеюсь понятно обьяснила. Кто может, поясните пожалуйста, никак не укладывается в голове эта информация.

1 лайк

Дословно, "прочитай в объекте catsFavoriteFood ключ со значением, которое мы поместили в переменную name".
В нашем случае, переменная name - аргумент функции, в него записывается значение, которое мы передаем во время вызова этой функции. В примере выше, это Снежок.

2 лайка

Спасибо за пояснение. В процессе прохождения вроде разобралась. Может поскажите почему мой код не работает?

var materialPrice = {
‘wood’: 1000,
‘stone’: 1500,
‘brick’: 2000
};

var house = {
rooms: 10,
floors: 5,
material: ‘wood’,
coefficient: 10.5,

calculateSquare: function() {
return (this.rooms * this.coefficient * this.floors);
},

calculatePrice: function() {
return (this.calculateSquare * materialPrice[material] );
}
};

Проблема в material – у нас нет такой переменной. Значение для material нам нужно либо передавать во время вызова функции (предварительно добавив такой аргумент в код функции-метода), либо заменить material на this.material, т.е. будем обращаться к полю material этого объекта.

P.S. Форматируйте код в сообщении, примеры здесь: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code
Где-то тут бегала гифка-пример на форуме, м.б. тов. @Hierumo подскажет где взять.

сейчас я добавила this, но резутат проверки выдает NaN.
var materialPrice = {
‘wood’: 1000,
‘stone’: 1500,
‘brick’: 2000
};

var house = {
  rooms: 10,
  floors: 5,
  material: 'wood',
  coefficient: 10.5,
  
  calculateSquare: function () {
    return (this.rooms * this.coefficient *  this.floors); 
  },
  
  calculatePrice: function () {
   return (this.calculateSquare * materialPrice[this.material]);
  }
};

1 лайк

Это функция, ее нужно вызвать:

calculatePrice: function () {
   return (this.calculateSquare() * materialPrice[this.material]);
}

Иначе, во время умножения интерпретатор пытается неявно преобразовать this.calculateSquare в число и получает NaN.

1 лайк

Спасибо большое! Наконец то разобралась :slight_smile:

@angemariya и @everhard Ребят, спасибо, хороший топик подняли! Без вас бы не разобралась.

Пример из теории с пояснениями как я это вижу, может кому пригодится для понимания:

// Мы записали в объект не характеристику вида name: 'Кекс', а соотношение имени кота и лакомства, которое по вкусу именно ему. 
var catsFavoriteFood = {
  Кекс: 'рыба',
  Рудольф: 'котлета',
  Снежок: 'сметана'
};

// Создали функцию, которая возвращает строку с любимой едой
var printFavoriteFood = function (name) {
	
  /* Здесь мы связали свойство объекта catsFavoriteFood с ПАРАМЕТРОМ функции printFavoriteFood с помощью [], таким образом name теперь ассоциируется как свойство объекта и далее в вызове функции мы просто выбираем нужное нам свойство (Кекс, Рудольф или Снежок), что при выводе нам даст соответствующее ему значение	*/
  return 'Моя любимая еда — ' + catsFavoriteFood[name];
};

/* ВНИМАНИЕ! Мы вызываем функцию printFavoriteFood где в качестве АРГУМЕНТА для ПАРАМЕТРА функции выступает свойство объекта catsFavoriteFood, а именно 'Снежок' */
// Выведет: Моя любимая еда — сметана
console.log(printFavoriteFood('Снежок'));
1 лайк