Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение связи между билетами на транспорт 
:(
    Опции темы
Mastodont
Дата 5.10.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



Предположим, есть пять билетов:
Автобус. Место отправления: Бангкок. Место прибытия: Нью-Йорк.
Поезд. Нью-Йорк - Таллин
Самолет. Таллин - Париж
Автобус. Париж - Москва
Поезд. Москва - Пекин

То есть в общем случае мы едем из Банкока в Пекин:)

Но в программу билеты передаются в случайном порядке. И мне надо отсортировать их в правильном, чтобы получилось "Бангкок - Нью-Йорк, затем Нью-Йорк - Таллин, Таллин - Париж, Париж - Москва, Москва - Пекин".

Написал такой скрипт
Код

<script type='text/javascript'>
//alert('есть'); //проверяю им, до какого места работает скрипт ;))
/*
for (var i = 1; i <= kolvo_transporta; i++)
{
    transport[i] = i;
}
*/

//var transport[];

transport[1][1] = 'Автобус';
transport[1][2] = 'Банкок';
transport[1][3] = 'Нью-Йорк';
transport[1][4] = '9'; //номер кресла
transport[1][5] = ''; //пустой элемент, в автобусе не используется

transport[2][1] = 'Поезд';
transport[2][2] = 'Нью-Йорк';
transport[2][3] = 'Таллин';
transport[2][4] = '124'; //номер позда
transport[2][5] = '154'; //номер кресла

transport[3][1] = 'Самолет';
transport[3][2] = 'Таллин';
transport[3][3] = 'Париж';
transport[3][4] = '99'; //номер самолета
transport[3][5] = '146'; //номер кресла

transport[4][1] = 'Автобус';
transport[4][2] = 'Париж';
transport[4][3] = 'Москва';
transport[4][4] = '157';
transport[4][5] =  '';

transport[5][1] = 'Поезд';
transport[5][2] = 'Москва';
transport[5][3] = 'Пекин';
transport[5][4] = '194';
transport[5][5] = '29';

var transport_kolvo = 5; //предположим, я знаю какое кол-во билетов у нас есть


//функция для сравнения 2го элемента одного массива и 3го элемента следующего массива
function sravnenie_2i2(nameArray, numFirstArray, numSecondArray)
{

    var 2elemOfFirstArray = nameArray[numFirstArray][2];
    var 2elemOfSecondArray = nameArray[numSecondArray][3];
    document.write(2elemOfFirstArray + ' и ' + 2elemOfSecondArray);
}

sravnenie_2i3('transport',1, 2); //нифига не дает, так как ява не поддерживает многомерные массивы

//document.write(transport[2]);
/*
for (var key in transport) {
    var val = transport[key];
    document.write(key+' = '+val + '<br>');
}
*/


</script>


И я думаю, что у меня даже получилось бы... если бы я писал на php. Но js не поддерживает многомерные массивы (ну насколько я понял, прошерстив 5 страниц гугла).  Подскажите, каким образом в js сравнить место прибития одного билета и место отправки следующего?

Это сообщение отредактировал(а) Mastodont - 5.10.2012, 12:25
PM MAIL   Вверх
JAYBE
Дата 5.10.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Код

cards = [];

//конструктор создания карточки для того, чтобы они хранились вместе и можно было ипортировать их (для упрощения ввода доп.карточки и отслеживания их в массиве)
/*
from - пункт отправления
to - пункт назначения
transport - тип транспорта
place - место (номер рейса, посадочное место)
etc - другая информация/комментарии
*/
var Card = (function() {
        return function(from, to, transport, place, etc) {
            if ( !from || !to || !transport || !place ) {
                alert("Неправильный формат карточки");
                return false;
            }
            this.from = from;
            this.to = to;
            this.transport = transport;
            this.place = place;
            this.etc = (etc)?etc:undefined;
            cards.push(this);
            return this;
        }
    })()

var card_4 = new Card("Stockholm", "New York JFK", "flight SK22", "Gate 22. Seat 7B", "Baggage will be automatically transferred from your last leg");
var card_2 = new Card("Barcelona", "Gerona Airport", "bus", "No seat assignment");
var card_1 = new Card("Madrid", "Barcelona", "train 78A", "Seat 45B");
var card_3 = new Card("Gerona Airport", "Stockholm", "flight SK455", "Gate 45B. Seat 3A");


TravelCards = function(data, options) {
    this.trip = [];
    this.settings = {
        template: undefined,
    }
    if(options) {
        for (var i in options) {
            this.settings[i] = options[i];
        }
    }
    if(data) {
        this.importCards(data);
    }
}

TravelCards.fn = TravelCards.prototype;
TravelCards.fn.template = function(card) {
    var temp;
    switch(this.settings.template) {
        case "first":
            temp = "•    From {{from}} take {{transport}} to {{to}}. {{place}}. {{etc}}";
            break;
        default:
            temp = "•    Take {{transport}} from {{from}} to {{to}}. {{place}}.";
            break;
    }
    return temp.replace(/{{([^{}]*)}}/gi, function(a, b) {
        if (!card[b]) {
            return "";
        }
        return (card[b])
    })
}
TravelCards.fn.importCards = function(data) {// метод импорта карточек
    if ( (data instanceof Array) ) {
        return this.getCards  = function() {
            return data;
        }
    } else if ( data instanceof Object ) {
        return this.getCards  = function() {
            return [data];
        }
    } else {
        alert( this.getMsg().wrong_format );
        return false;
    }
}

TravelCards.fn.getMsg = (function() {
    var msges = {
        wrong_format: "Неправильный формат карточек",
        not_sorted: "Карточки не были отсортированы",
        no_cards: "Нет карточек или они не были импортированы"
    }
    return msges;
})

TravelCards.fn.sort = function() {//метод сортировки
    var trip = this.trip = [this.getCards().shift()], temp = trip[0];
    while(this.getCards().length) {
        var i = this.getCards().length;
        while(i--) {
            if(temp.to == this.getCards()[i].from) {
                temp = this.getCards().splice(i,1)[0];
                trip.push(temp);
            } else if(temp.from == this.getCards()[i].to) {
                temp = this.getCards().splice(i,1)[0];
                trip.unshift(temp);
            }
        }
    }
    return trip;
}
TravelCards.fn.write = function(template) {
    if (!this.getCards) {
        alert( this.getMsg().no_cards );
        return false;
    } else if(!this.trip.length) {
        alert( this.getMsg().not_sorted );
        return false;
    }
    for (var i=0, length=this.trip.length; i<length; i+=1) {
        document.write(this.template(this.trip[i])+"<br>")
    }
}
function runOnLoad(f) {
    try {
        var f = new TravelCards(cards);
        f.sort(); f.write();
    } catch(err) {
        document.write("Ошибка:" + err)
    }
    return;
}

if(window.addEventListener)
    window.addEventListener("load", runOnLoad(), false)
    else if (window.attachEvent) window.attachEvent("onload", runOnLoad())
    else window.onload = runOnLoad();

/*
Выходные данные - объект конструктора TravelCards
метод getCards - возвращает массив неосортированных карточек
this.trip - массив отсортированных карточек - путешествие
*/    


P.S. Как вышлешь напиши мне в личку о результате =)

Это сообщение отредактировал(а) Aliance - 11.3.2013, 11:05
PM   Вверх
skyboy
Дата 5.10.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(Mastodont @  5.10.2012,  11:22 Найти цитируемый пост)
 Но js не поддерживает многомерные массивы

акцентирую внимание: как можно видеть в коде JAYBE, то, что в РНР зовется ассоциативным массивом, в джаваскрипте — объект.

Цитата(JAYBE @  5.10.2012,  13:49 Найти цитируемый пост)
var Card = (function() {
        return function(from, to, transport, place, etc) {
            if ( !from || !to || !transport || !place ) {
                alert("Неправильный формат карточки");
                return false;
            }
            this.from = from;
            this.to = to;
            this.transport = transport;
            this.place = place;
            this.etc = (etc)?etc:undefined;
            cards.push(this);
            return this;
        }
    })()

JAYBE, зачем это? в смысле, анонимная функция-генератор конструктора. не вижу надобности в этой конструкции. да и остальной код достаточно запутанный. куча проверок, куча конструкторов. пускай в продакшн коде, но когда человек просит совета, лучше — попроще.
PM MAIL   Вверх
Aliance
Дата 7.10.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата
var 2elemOfFirstArray

переменные лучше называть, начиная с буквы, на крайняк с _
PM MAIL WWW ICQ Skype   Вверх
Leshak
Дата 11.3.2013, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Вот интересно, сколько лет эту задачу в Яндексе будут давать соискателям?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.