@taki154

Почему для возвращенного выражения недоступны свойства объекта?

Доброго времени суток! Практикуюсь в работе с функциями\массивами\объектами и впал в ступор в следующей ситуации, с чем и пришел сюда за советом от гуру :)

Суть дела: есть массив объектов и есть функция, которая выводит отсортированные данные из объектов, хранящихся в массивах. В функцию передается массив объектов и некоторый тип, в зависимости от которого строится вывод данных.

В консоли ловлю ошибку, говорящую
index.html:48 Uncaught ReferenceError: i is not defined
at sortTypeMessage (index.html:48)
at printProducts (index.html:32)
at index.html:80


Ниже фрагмент кода. Всю голову сломал. Буду рад подсказке. :) заранее спасибо за помощь. Проблема именно с выводом, код сортировки не привожу, т.к. он простой как пять копеек и без него все куда показательнее

var products = [
		{name:"Grapefruit", calories: 170, color: "red", sold: 8200},
		{name:"Orange", calories: 160, color: "orange", sold: 12101},
		{name:"Cola", calories: 210, color: "caramel", sold: 25412},
		{name:"Diet cola", calories: 0, color: "caramel", sold: 43922},
		{name:"Lemon", calories: 200, color: "clear", sold: 14983},
		{name:"Rapsberry", calories: 180, color: "pink", sold: 9427},
		{name:"Root Beer", calories: 200, color: "caramel", sold: 9909},
		{name:"Water", calories: 0, color: "clear", sold: 62123}
	];

	function printProducts(products, type){
		var getSortMessage = sortTypeMessage(type)
		for (var i = 0; i < products.length; i++) {
			getSortMessage();
		}
		console.log("-------------");
	}

	function sortTypeMessage(type){
		switch(type){
				case 'name':
					return console.log('Название продукта: ' + products[i].name);
				break;

				case 'sold':
					return console.log(
						'Продукт: '
						+ products[i].name
						+ 'был продан '
						+ products[i].sold
						+ ' раз.'
						);
				break;

				case 'color':
					return console.log(
						'Продукт: '
						+ products[i].name
						+ 'имеет '
						+ products[i].sold
						+ ' цвет.'
						);
				break;

				case 'calories':
					return console.log(
						'Продукт: '
						+ products[i].name
						+ 'имеет '
						+ products[i].calories
						+ ' калорий.'
						);
				break;

		}
	}

	printProducts(products, "sold");
  • Вопрос задан
  • 81 просмотр
Решения вопроса 2
@RidgeA
Тут var getSortMessage = sortTypeMessage(type)
ты ожидаешь, что функция вернет функцию, но на самом деле она возвращает undefined - везде стоит return console.log.... .

Внутри функции sortTypeMessage переменной i не существует, отсюда и ошибка.
Ответ написан
devellopah
@devellopah
всё же так лучше

var products = [
  {name:"Grapefruit", calories: 170, color: "red", sold: 8200},
  {name:"Orange", calories: 160, color: "orange", sold: 12101},
  {name:"Cola", calories: 210, color: "caramel", sold: 25412},
  {name:"Diet cola", calories: 0, color: "caramel", sold: 43922},
  {name:"Lemon", calories: 200, color: "clear", sold: 14983},
  {name:"Rapsberry", calories: 180, color: "pink", sold: 9427},
  {name:"Root Beer", calories: 200, color: "caramel", sold: 9909},
  {name:"Water", calories: 0, color: "clear", sold: 62123}
];
  
  
var mapper = {
 	'sold': function (product) {
    console.log('Продукт: ' + product.name + ' был продан ' + product.sold + ' раз.');
  },
  'name': function (product) {
  	console.log('Название продукта: ' + product.name);
  },
  'calories': function (product) {
  	console.log('Продукт: ' + product.name + ' имеет ' + product.calories + ' калорий.');
  },
  'color': function (product) {
  	console.log('Продукт: ' + product.name + ' имеет ' + product.color + ' цвет.');
  }
};
 
 printBy(products, 'calories');
 
 function printBy(collection, prop) {
   collection.map(mapper[prop]);
 }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы