Jump to content
  • 0

Помогите разобраться с двумя задачами на js


grafnet
 Share

Question

Выполяю задания из книги по js:

 

1. Списки

Списки удобны тем, что они могут делиться частью своей структуры. Например, можно сделать два списка, {value: 0, rest: list} и {value: -1, rest: list}, где list – это ссылка на ранее объявленную переменную. Это два независимых списка, при этом у них есть общая структура list, которая включает три последних элемента каждого из них. Кроме того, оригинальный список также сохраняет свои свойства как отдельный список из трёх элементов.

 

Напишите функцию arrayToList, которая строит такую структуру, получая в качестве аргумента [1, 2, 3], а также функцию listToArray, которая создаёт массив из списка. Также напишите вспомогательную функцию prepend, которая получает элемент и создаёт новый список, где этот элемент добавлен спереди к первоначальному списку, и функцию nth, которая в качестве аргументов принимает список и число, а возвращает элемент на заданной позиции в списке, или же undefined в случае отсутствия такого элемента.

Если ваша версия nth не рекурсивна, тогда напишите её рекурсивную версию.

console.log(arrayToList([10, 20]));// → {value: 10, rest: {value: 20, rest: null}}console.log(listToArray(arrayToList([10, 20, 30])));// → [10, 20, 30]console.log(prepend(10, prepend(20, null)));// → {value: 10, rest: {value: 20, rest: null}}console.log(nth(arrayToList([10, 20, 30]), 1));// → 20

C функцией arrayToList я разобрался, а вот в остальным - никак.

 

2. Глубокое сравнение

Оператор == сравнивает переменные объектов, проверяя, ссылаются ли они на один объект. Но иногда полезно было бы сравнить объекты по содержимому.

Напишите функцию deepEqual, которая принимает два значения и возвращает true, только если это два одинаковых значения или это объекты, свойства которых имеют одинаковые значения, если их сравнивать рекурсивным вызовом deepEqual.

Чтобы узнать, когда сравнивать величины через ===, а когда – объекты по содержимому, используйте оператор typeof. Если он выдаёт “object” для обеих величин, значит нужно делать глубокое сравнение. Не забудьте об одном дурацком исключении, случившемся из-за исторических причин: “typeof null” тоже возвращает “object”.

var obj = {here: {is: "an"}, object: 2};console.log(deepEqual(obj, obj));// → trueconsole.log(deepEqual(obj, {here: 1, object: 2}));// → falseconsole.log(deepEqual(obj, {here: {is: "an"}, object: 2}));// → true
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

awdf, спасибо! Было бы чрезвычайно круто, если бы Вы еще расписали логику решения заданий словами. Например во втором задании мне не полностью потянет этот участок и еще другие моменты.

for(var property in obj1)            {                if(obj1.hasOwnProperty(property) && obj2.hasOwnProperty(property))                {                    if(!deepEqual(obj1[property], obj2[property]))                    {                        equals = false;                    }                }                else                {                    equals = false;                }            }
Edited by grafnet
Link to comment
Share on other sites

  • 0
 


            var equals = true; // Создать переменную "совпадают ли все свойства объекта"
for(var property in obj1) // Пройтись по свойствам первого объекта, сохраняя название свойства в "property"
{
if(obj1.hasOwnProperty(property) && obj2.hasOwnProperty(property)) // Проверить, оба ли сравниваемые объекты имеют это свойства
{
if(!deepEqual(obj1[property], obj2[property])) //сравнить свойства
{
equals = false; // если не равны - поставить значение переменной
}
}
else
{
equals = false; // если не у каждого - поставить значение переменной
}
}

Edited by afdw
Link to comment
Share on other sites

  • 0

Можно также подробней разъяснить этот момент:

 

 


if(!deepEqual(obj1[property], obj2[property])) //сравнить свойства { equals = false; // если не равны - поставить значение переменной }

Т.е. вызывается снова deepEqual с передачей свойств, а как дальше происходит само сравнение этих свойст?

Edited by grafnet
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By digenis
      Проблема заключается в том что мне нужно чтобы изображение было на левом краю до конца блочного элемента, а список чтобы был справа и также до конца блочного элемента. Это все в заголовке.  https://jsfiddle.net/Lyguc520/3/

    • By sadosado
      Как переместить картинку слева от категории списка?
      <ul class="dropdown-menu" data-navigation="dropdown-menu"> {% category_tree depth=2 as tree_categories %} <li><a tabindex="-1" href="{% url 'catalogue:index' %}">{% trans "All products" %}</a></li> {% if tree_categories %} <li class="divider"></li> {% for tree_category, info in tree_categories %} {% if info.has_children %} <li class="dropdown-submenu"> {% thumbnail tree_category.image "20x20" upscale=False as thumb %} <img class="img-thumbnail" src="{{ thumb.url }}" alt="{{ category.name }}" title="{{ category.name }}" style="right: 10px;"/> {% endthumbnail %} <a tabindex="-1" href="{{ tree_category.get_absolute_url }}">{{ tree_category.name }}</a> <ul class="dropdown-menu"> {% else %} {% thumbnail tree_category.image "20x20" upscale=False as thumb %} <img class="img-thumbnail" src="{{ thumb.url }}" alt="{{ category.name }}" title="{{ category.name }}" style="right: 10px;"/> {% endthumbnail %} <li><a tabindex="-1" href="{{ tree_category.get_absolute_url }}">{{ tree_category.name }}</a></li> {% endif %} {% for close in info.num_to_close %} </ul></li> {% endfor %} {% endfor %} {% endif %} <li class="divider"></li> {% block nav_dropdown_extra_items %} <li><a href="{% url 'offer:list' %}">{% trans "Offers" %}</a></li> {% endblock %} </ul> <li> <a href="/contacts/"> {% trans "Contacts" %} </a> </li> {% block nav_extra %} {% endblock %} </ul>
    • By Free3e
      Добрый день.
       
      Подскажите пожалуйста как правильно реализовать данное меню или список, не знаю как правильней назвать.
      Нужно чтобы при нажатии на город появлялся блок с информацией и загорался определенное место на карте.
      Если с появлением блока более менее понятно, то как позиционировать эти красные (активные) города, чтобы они не съезжали с карты на разных разрешениях.
      Буду благодарен ссылкам на демо и примеры.
       
      С меня кофе тому кто поможет мне найти хорошее решение =)

    • By Ольга А.
      Добрый день.
       
      Как сделать так, чтобы маркированный список был справа от изображения без обтекания.
      Сейчас список обтекает картинку вот так: http://cv38564-wordpress.tw1.ru/услуги/
       
      спасибо!
    • By Алексей2802
      Помогите, люди добрые!!
      Совсем запутался в решении проблемы...
      В общем, необходимо, чтобы при наведении на пункт меню фон менялся с черного на белый, а цвет ссылок наоборот, с белого на черный. С родительским пунктом меню всё работает, но с пунктами подменю начинается неразбериха - http://jsfiddle.net/3vfxua8q/
       
      Заранее спасибо!
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy