jack_azizov
@jack_azizov

Как читается решение данной задачи?

Здравствуйте. В учебнике наткнулся на данный пример задачи :

function findCarInLot (car) {
	for (var i = 0 ; i < lot.length ; i ++) {
		if ( car === lot[i] ) {
			return i ;
		}
	}
			return - 1 ;
}

var chevy = {
	make : "Chevy" ,
	model : "Bel Air"
} ;

var taxi = {
	make : "Webville Motors" ,
	model : "Taxi"
} ;

var fiat1 = {
	make : "fiat" ,
	model : "500" 
} ;

var fiat2 = {
	make : "fiat" ,
	model : "500" 
} ;

var lot = [chevy , taxi , fiat1 , fiat2] ;

var loc1 = findCarInLot(fiat2) ;   // Результат 3
var loc2 = findCarInLot(taxi) ;    // Результат 1
var loc3 = findCarInLot(chevy) ; // Результат 0
var loc4 = findCarInLot(fiat1) ;   // Результат 2


Никак не могу уловить логику решения. Зачем здесь заданы объекты ? Используются ли они в данном цикле или же здесь по сути нужен лишь массив?
Если не трудно опишите полноценный процесс словами , что происходит после вызова функции и передачей ей аргумента. ? как получается тот или иной результат.
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Stepanya
В функции findCarInLot ошибка, она должна быть такой
function findCarInLot (car) {
  for (var i = 0 ; i < lot.length ; i ++) {
    if ( car === lot[i] ) {
      return i ;
    }
  }
  return - 1 ;
}


Эта функция бежит по элементам массива lot и если этот элемент равен тому, что мы хотим найти возвращает его
Ответ написан
Комментировать
PretorDH
@PretorDH
HTML5, CSS3, PHP, JS - люблю в чистом виде.
Ошибка
var loc1 - findCarInLot(fiat2) ;   // Результат SyntaxError: Unexpected token -
var loc2 - findCarInLot(taxi) ;    // Результат SyntaxError: Unexpected token -
var loc3 - findCarInLot(chevy) ; // Результат SyntaxError: Unexpected token -
var loc4 - findCarInLot(fiat1) ;   // Результат SyntaxError: Unexpected token -


Потому-что в место "-" должно стоять "=".

А вообще функция строго сравнивает обьекты и выдает индекс Элемента в масиве. Но так делать плохо - медленно, так как сравниваются все поля обьектов.

Потрудитесь на этапе проектирования, и поменяйте архитектуру того куска, который пользуется этой функцией, и избавитесь от перебора масива. Например: можно прописать в масиве ключи соотвествующие уникальному атрибуту обьектов, и просто выбирать из масива по этому атрибуту.
var data = {
'chevy' : {  id : 'id0',  make : "Chevy" ,  model : "Bel Air" },
'taxi' : {  id : 'id1' , make : "Webville Motors" ,  model : "Taxi" },
'fiat1' : { id : 'id2', make : "fiat" ,  model : "500" },
'fiat2' : {  id : 'id3',  make : "fiat" ,  model : "500" }
} ;
var a = data['fiat1'];

var lot = { 'id0':'2' , 'id1':'0' , 'id2':'1' , 'id3':'3'} ;    // здесь ключи стоответсвуют id, а значения порядку в lot.
lot[ data['chevy'].id ];  // =>2
lot[ a.id ]; // => 1
lot[ data['taxi'].id ]; //=> 0
Ответ написан
abyrkov
@abyrkov
JavaScripter
Ну что тут сложного? У нас есть массив lot
var lot
есть парочка объектов
var chevy = {
  make : "Chevy" ,
  model : "Bel Air"
} ;

var taxi = {
  make : "Webville Motors" ,
  model : "Taxi"
} ;

var fiat1 = {
  make : "fiat" ,
  model : "500" 
} ;

var fiat2 = {
  make : "fiat" ,
  model : "500" 
} ;

мы берем и копируем ссылки на них в массив и присваиваем его lot
var lot = [chevy , taxi , fiat1 , fiat2]
есть у нас магическая функция findCarInLot, с помощью которой мы находим индекс машины в массиве
var loc1 = findCarInLot(fiat2) ;   // Результат 3
var loc2 = findCarInLot(taxi) ;    // Результат 1
var loc3 = findCarInLot(chevy) ; // Результат 0
var loc4 = findCarInLot(fiat1) ;   // Результат 2


Магическая функция работает так:
в параметры нам передают машину
function findCarInLot (car) {
  ...
}

потом мы запускаем цикл по lot
...
  for (var i = 0 ; i < lot.length ; i ++) {
    ...
  }
...

в цикле, lot[i] указывает на текущий элемент
а мы его сравниваем с переданной нам машиной
...
    if ( car === lot[i] ) {
      ...
    }
...

Если они совпадают, мы прерываем функцию, возвращая индекс - return i;
если же весь цикл выполнился и не прервался, то мы возвращаем -1 - return -1;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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