JS Basics подготовка за изпит 01.04.2015 - Задача 4
Днес присъствах на подготовката за изпит, която се проведе, и ми направи впечатление обсъждането около 4-та задача.
Задачата беше All that luggage от https://judge.softuni.bg/Contests/56/JavaScript-Basics-9-January-2015
Направи ми впечатление, че се кара малко на output driven development. Като ще трябва да изкараме един тип обект и директно се почва да се пълни такъв обект, пък после че трябва да се сортира - голяма работа :)
Накрая увиснахме с обект, който няма консистентни пропъртита. Единият има пропърти clothes, другият - banana... :) Ходи ги сортирай.
Някой колега даде идея да се вкарат тези "багажи" в масив, а после да се изтрие квадратната скоба. Това би проработило, пак с известни хакове ще се сортират ключовете, но поне сортирането по килограми ще е по-лесно. За щастие нищо във входа не съдържа квадратни скоби и един стринг риплейс ще свърши работа. Аз не го намирам за много правилен вариант.
Това, което предлагам аз е да се пълни колекцията с туристи и багажи в удобен за програмиста начин, а не в удобен за изхода начин.
Една колекция, която съдържа обекти от следния тип
ИмеНаТуриста: ...
Багажи: {{нова колекция}}
ИмеНаБагажа: ...
Тегло: ...
Чупливо: ...
Тип: ...
НачинНаТранспорт: ...
Това какво предимство ни дава? Можем да сортираме масив от обекти, по common property. Т.е. по ключ, който съществува във всеки един обект. А ако имаме ИмеНаБагажа и Тегло във всеки обект в колекцията с багажи, много лесно можем да сортираме тази колекция/масив.
И когато стане време да аутпутнем, просто ще превърнем нашия масив, в такъв обект какъвто го искат за изхода и ще го принтираме.
Прилагам едно решение, което скалъпих преди малко, може би не е най-оптиизираното, но имплементира тази идея. Със сигурност някои if-ове и цикли имат и по-хитър начин да се направят. Решението без коментарите е около 80 реда. Авторското е 50 реда, така че не казвам, че е по-кратко, но е reusable.
Използвам и един трик - нашия масив от багажи си има ключове "ИмеНаБагажа" и "Тегло", точно един от двата ключа, може да бъде критерий за сортиране. Така че директно взет от user input-а този критерий се слага във функцията за сортиране и се сортират. Няма нужда от switch/case. Има само един IF който проверява ако е "strict" да не прави нищо.
Позволих си да напиша целия този пост с идеята да дам хинт да се работи не по подхода - какъвто ще е изхода да тръгнем от него, а така да си нагласим нещата, че да са ни удобни за работа. Особено когато трябва да приложим сет от операции върху нещо голямо. Изходът винаги е трудната част в judge-а, но не трябва работата ни да се върти около него. Той се наглася все някак накрая :)
Ето го решението с коментари: http://pastebin.com/URpMje26
Успех на изпита.
Това не го знаех. Признавам си не бях отварял документацията за "delete". Сега я отворих, документирано е:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
"When you delete an array element, the array length is not affected. This holds even if you delete the last element of the array."
Май в такива случая трябва да му намериш индекса и splice(index, 1);
Дамммм красота. Квото и да кажа ще е малко :D Моя любима JS
delete работи за триене на ключове от обекти, един вид просто прави стойността undefined. За масиви - да, splice е правилният начин.