Загрузка...

Problem with changing an array in JavaScript

Thread in Node.js created by Unical Apr 30, 2024. 217 views

  1. Unical
    Unical Topic starter Apr 30, 2024 Сука я кто? 181 Nov 13, 2019
    JS
    var obj1 = {
    countries: countries.slice(),
    outCountries: function() {
    var clonedCountries = JSON.parse(JSON.stringify(this.countries)); // Создание копии массива
    console.log("Вывод через obj1");
    console.log(clonedCountries);
    }
    };

    var obj2 = {
    countries: countries.slice(),
    changeCountries: function(data) {
    var targetCountries = this.countries.slice();
    console.log(targetCountries==this.countries)
    if (data === 0) {
    for (var i = 0; i < targetCountries.length; i++) {
    for (var j = 0; j < targetCountries[i].length; j++) {
    if (Array.isArray(targetCountries[i][j])) {
    targetCountries[i][j].sort((a, b) => a[2] - b[2]);
    }
    }
    }
    console.log("Литературные произведения объекта отсортированы по возрастанию года издания:");
    } else if (data === 1) {
    for (var i = 0; i < targetCountries.length; i++) {
    for (var j = 0; j < targetCountries[i].length; j++) {
    if (Array.isArray(targetCountries[i][j])) {
    targetCountries[i][j].sort((a, b) => b[2] - a[2]);
    }
    }
    }
    console.log("Литературные произведения объекта отсортированы по убыванию года издания:");
    }

    }
    };


    // Продемонстрировать «работу» объектов, реализовав следующие действия:

    // 1. Вывести информацию о государствах объекта obj1 с помощью метода outCountries
    console.log("Информация о государствах объекта obj1:");
    obj1.outCountries();

    // 2. Вывести имеющуюся информацию о государствах объекта obj2 с помощью метода outCountries объекта obj1
    console.log("Информация о государствах объекта obj2:");
    obj1.outCountries.call(obj2);

    // 3. Изменить данные obj1.countries с помощью метода changeCountries объекта obj2
    obj2.changeCountries.call(obj1, 1);

    // 4. Отобразить изменения в браузере с помощью метода outCountries объекта obj1
    console.log("Информация о государствах объекта obj1 после изменений:");
    obj1.outCountries();

    // 5. Показать, как (не)изменились данные поля countries объекта obj2
    console.log("Информация о государствах объекта obj2:");
    obj1.outCountries.call(obj2);
    [FONT=inherit][COLOR=inherit]
    [/COLOR][/FONT]


    JS
    var countries=[
    ["Италия", "Рим", "Евразия", "Европа", -2, "итальянская лира",
    ["Альпы", "Пальмария", "Апеннинский полуостров", "Комо", "Тальяменто"],
    [["Джованни Верга", "Жизнь среди полей", 1880], ["Анна Виванти", "Цирцея", 1912], ["Джузеппе Понтиджа", "Рождённые дважды", 2000]],
    {"1882":"избирательная реформа", "1945":"антифашистское восстание, 18-28 апреля"}
    ],
    [ ["Эндр", "Пиренеи", "Луара", "Альпы", "Бискайский залив"],
    "Франция", -1, "Париж", "Евразия", "Европа", "евро",
    [["Александр Дюма", "Граф Монте-Кристо", 1845], ["Жюль Габриэль Верн", "Завещание чудака", 1900], ["Луи Анри Буссенар", "Капитан Сорви-голова", 2001], ["Морис Самюэль Роже Шарль Дрюон", "Тисту — мальчик с зелеными пальцами", 1957]],
    {"1572":"Варфоломеевская ночь", "1648":"Вестфальский мир", "1914":"Марнское сражение, 5-12 сентября"}
    ],
    [ [["Иоханна Спири", "Хайди: годы странствий и учёбы", 1880], ["Герман Гессе", "Игра в бисер", 1942], ["Макс Фриш", "Homo Фабер", 1957], ["Мелинда Надь Абонджи", "Голуби взлетают", 2010]],
    "Швейцария", "отсутствует", "Евразия", "Европа", -1, "Швейцарский франк",
    ["Бильское озеро", "Рейхенбахский водопад", "Альпы", "Алечский ледник"],
    {"1291":"основание Швейцарии", "1844":"начало работы первой железнодорожной линией"}
    ],
    ["Венгрия", "Будапешт", "Евразия", "Европа", -1, ["Геллерт", "Карпаты", "Веленце", "Мезёфёльд"],
    "Венгерский форинт",
    [["Янош Бачаньи", "Мужество венгров", 1785], ["Аттила Бартиш", "Спокойствие", 2001], ["Ийеш Дьюла", "Двое мужчин", 1950]],
    {"1222":"подписание Эндре II «Золотой буллы»", "1867":"Коронование Франца-Иосифа в Будапеште по старым обычаям, 8 июня"}
    ],
    [ "Румыния", "Бухарест", "Евразия", "Европа", "Румынский лей",
    ["Олт", "Трансильванское плато", "Карпаты", "Медвежья пещера", "Бабеле"], 0,
    {"1881":"Румыния была провозглашена королевством", "1990":"первые свободные президентские и парламентские выборы", "2004":"Румыния стала членом НАТО"},
    [["Михаил Садовяну", "Золотая ветвь", 1933], ["Мирча Элиаде", "Изабель и воды дьявола", 1930]]
    ],
    [ "Япония", "Токио", "Евразия", "Азия",
    ["Фудзияма", "Сакурадзима", "Абукума"],
    [["Сюсаку Эндо", "Море и яд", 1958], ["Юдзо Ямамото", "Профессор Цумура", 1919], ["Марико Хасиока", "Аут", 1997]],
    {"1872":" отменена сложного и строгого сословного деления", "1904":"японский флот атаковал русскую эскадру в Порт-Артуре", "1941":"атака на Пёрл-Харбор"},
    6, "японская иена"
    ],
    [ 1.5,"Афганистан", "Кабул", "Евразия", "Азия", "афгани",
    [["Гуль Пача Ульфат", "Голос сердца", 1962], ["Абдуррауф Бенава", "Горестные размышления", 1957], ["Махмуд-бек Тарзи", "Путешествия через три континента за 29 дней", 1914]],
    {"1973":"провозглашение Республики, 17 июля", "2004":"новая Конституция и проведены первые президентские выборы"},
    ["Намакзар", "Дашти-Марго", "Фарахруд", "Гиндукуш"]
    ],
    [ {"1857":"Восстание Сипаев", "1617":"Британская Ост-Индская компания получила право торговать с Индией", "1948":"Операция «Поло»", "1986":"архитектурное наследие Хампи включено в список Всемирного наследия"},
    "Индия", "Нью-Дели", "Евразия", "Азия", 2.5, "Индийская рупия",
    ["Ганг", "Гуру-Сикар", "Дудхсагар", "Цо-Морари", "Деканские траппы"],
    [["Арундати Рой", "Бог мелочей", 1997], ["Хушвант Сингх", "Поезд в Пакистан", 1956]]
    ],
    ["Бразилия", "Бразилиа", "Южная Америка", "Америка", -6, "риал",
    ["Тапажос", "Пантанал", "пампа", "Сейшас", "Параноа"],
    [["Лима Баррето", "Жалкий конец Поликарпо Кваресма", 1911], ["Эрику Верисиму", "Происшествие в Антаресе", 1971], ["Шику Буарки", "Будапешт ", 2003], ["Жоаким Мануэл ди Маседу","Смуглянка", 1844]],
    {"1888":"Золотой закон об отмене рабства в Бразилии, 13 мая", "1935":"вооружённое выступление бразильских коммунистов и тенентистов"}
    ],
    [ ["Фанди", "Подкова", "Элсмир", "Невольничье озеро", "Оттава"],
    [["Филип Майкл Ондатже", "Английский пациент", 1992], ["Маргарет Этвуд", "Up In The Tree", 1978]],
    "Канада", "Оттава", "Северная Америка", "Америка", -7, "канадский доллар",
    {"1608":"основание города Квебек", "1838":"Битва за ветряную мельницу", "1867":"Канада получила право формировать собственное правительство"}
    ],
    ["Аргентина", "Буэнос-Айрес", "Южная Америка", "Америка", -6, "аргентинское песо",
    [["Хорхе Луис Борхес", "Фунес памятливый", 1942]],
    ["Охос-дель-Саладо", "Огненная земля", "Пампа", "Лагунас-де-Гуанакаче"],
    {"1912":"закон о всеобщем избирательном праве", "1871":"Завоевание пустыни", "1810":"Аргентинская война за независимость"}
    ],
    [ ["Кристобаль-Колон", "Магдалена", "Каука", "Анды", "Льянос"],
    [["Рафаэль Помбо", "Флибустьеры", 1856], ["Хосе Эустасио Ривера", "Вихрь", 1924], ["Лаура Рестрепо", "Леопард на солнце", 1993]],
    "Колумбия", "Богота", "Южная Америка", "Америка", -8, "колумбийское песо",
    {"1916":"обнаружены богатейшие запасы нефти", "1549":"образование королевской аудиенсии и канцелярии Санта-Фе де Боготы", "1886":"принята консервативная конституция"}
    ],
    [ "Англия", "Лондон", "", "", -3, "фунт стерлингов",
    ["Тис", "Белые клифы Дувра", "Саут-Даунс", "Скофелл-Пайк"],
    {"1701":"Акт о престолонаследии", "1455":"начало войны Алой и Белой розы", "1215":"Великая хартия вольностей"},
    [["Майн Рида", "Огненная земля", 1883], ["Уильям Шекспир", "Ромео и Джульетта", 1595], ["Оскар Уайльд", "Портрет Дориана Грея", 1891], ["Джонатан Свифт", "Путешествия в некоторые удалённые страны мира в четырёх частях: сочинение Лемюэля Гулливера, сначала хирурга, а затем капитана нескольких кораблей", 1726]]
    ],
    [ "Мексика", "Мехико", "Южная Америка", "Америка", -9, "мексиканское песо",
    {"1810":"Мексиканская война за независимость", "1536":"открытие коллегиума Санта-Крус де Тлателолько", "2006":"Революция кактусов"},
    ["Попокатепетль", "Калифорния", "Эль-Вискаино", "Сонора", "Чапала", "Гуадалупе", "Пещера Ласточек"],
    [["Октавио Пас", "Salamandra", 1962], ["Амадо Нерво", "Недвижная возлюбленная", 1922], ["Карлос Фуэнтес", "Смерть Артемио Круса", 1962], ["Хуан Рульфо", "Педро Парамо", 1955]]
    ]
    ];
    Дело в том, что есть два объекта.



    Нужно изменить
    ⁡obj1.countries
    ⁡ через
    ⁡obj2.changeCountries
    ⁡ . Я вызываю
    ⁡obj2.changeCountries.call(obj1, 1);
    ⁡ и при этом изменяется и
    ⁡obj1.countries
    ⁡ и
    ⁡obj2.countries
    ⁡ .
    Я даже проверил не равны ли ссылки.
    Чат лгбт хуйню несет, помочь не может.

    Честно, я чуть с ума не сошел, пытаясь это исправить.
     
  2. skyenot
    skyenot Apr 30, 2024 7402 Jun 6, 2019
    [IMG]
    Всё правильно чат выдал, this.countries - это твой массив со второго участка кода
     
    1. View previous comments (5)
    2. Unical Topic starter
      skyenot, Боже блин если это так, то ты просто мне глаза открыл. Спасибо, сейчас попробую :owoshy:
    3. skyenot
      Unical, либо более элегантный вариант тоже с последними обновлениями - обновляй массив targetCountries таким образом:
      targetCountries = targetCountries.toSorted(...) вместо sort: sort меняет изначальный массив, а toSorted не меняет, а возвращает новый массив
    4. Unical Topic starter
      skyenot, Ты прям в точку попал[IMG] ссылки одни и те же у массивов в массиве
Loading...
Top