Загрузка...

Problem with changing an array in JavaScript

Thread in Node.js created by Unical Apr 30, 2024. 219 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 (6)
    2. skyenot
      Unical, либо более элегантный вариант тоже с последними обновлениями - обновляй массив targetCountries таким образом:
      targetCountries = targetCountries.toSorted(...) вместо sort: sort меняет изначальный массив, а toSorted не меняет, а возвращает новый массив
    3. Unical Topic starter
      skyenot, Ты прям в точку попал[IMG] ссылки одни и те же у массивов в массиве
Loading...
Top