Javascript: Коллекция с альбомами (JS 91)



  • Здравствуйте!
    Есть затруднение с данным заданием. Невозможно изменить аргументы функции, все время выдает одно и то же.
    id = 2548; prop = "tracks"; value = "".
    Заранее спасибо.



  • Киньте правильный код кто нибудь, не могу понять вообще задачу, в консоле выполняю все нормально


  • administrators

    @artemv @trixpk надо просто реализовать цепочку условий, подскажу на псевдокоде:

    
    function updateRecords(id, prop, value) {
    
    // если (value === "") {
    //   удаляем свойство prop из альбома ( для доступа используем collection[id][prop] )
    // } иначе если (prop === "tracks") {
    //  если в альбоме отсутствует свойство "tracks", то создайте пустой массив, присвойте этот массив отсутствующему свойству в альбоме
    //  и надо добавьте value в конец существующего массива tracks.
    // } иначе {
    //  Случай когда prop содержит значение !== "tracks" и value !== ""), 
    //   установить новое значение value свойству с именем prop ( collection[id][prop] = новое_значение )
    // }
    }
    


  • Ну примерно так я и думал. Вот код:

    // Инициализация
    var collection = {
        "2548": {
          "album": "Slippery When Wet",
          "artist": "Bon Jovi",
          "tracks": [ 
            "Let It Rock", 
            "You Give Love a Bad Name" 
          ]
        },
        "2468": {
          "album": "1999",
          "artist": "Prince",
          "tracks": [ 
            "1999", 
            "Little Red Corvette" 
          ]
        },
        "1245": {
          "artist": "Robert Palmer",
          "tracks": [ ]
        },
        "5439": {
          "album": "ABBA Gold"
        }
    };
    // Копия коллекции для тестов
    var collectionCopy = JSON.parse(JSON.stringify(collection));
    
    // Измените код только под комментарием.
    function updateRecords(id, prop, value) {
      if (collection[id].tracks !== prop && value !== "") {
            collection[id].prop = value;
        } else if (collection.hasOwnProperty['track'] === false && prop === "tracks") {
            collection[id].tracks.push(value);
        } else if (prop === "track" && value !== "") {
            collection[id].prop = value;
        } else if (value === "") {
            delete collection[id].prop;
        };
      return value;
      }
    // Измените значение аргумента для проверки
    updateRecords(5439, "artist", "ABBA");
    
    
    updateRecords(5439, "artist", "ABBA");
    


  • Вот если заменить строчку "return collection" на "return id+" "+prop+" "+value;". То при запросе: "updateRecords(5439, "artist", "ABBA");" выдает "updateRecords(5439, tracks, "" "ABBA");".
    В "локале" код работает.



  • @artemv Созданная вами функция должна всегда возвращать объект коллекции.



  • Функцию засчитывает.Но есть одна проблема.
    Альбом 2548
    Теряет свои изначальные значения при вызове функции.
    Так и должно быть или нет? по заданию так и не понял.
    Codepen

    // Измените код только под комментарием.
    function updateRecords(id, prop, value) {
    if(value === ""){
    delete collection[id][prop];
    }
    else if(prop === "tracks" && collection[id].hasOwnProperty(prop) == false){
    collection[id][prop] = [value];
    }
    else if (prop !== "tracks" && value !== ""){
    collection[id][prop] = value;
    }
    else if(prop === "tracks" && value !== "") {
    collection[id][prop].push(value);
    }
    return collection;
    }
    //P.s. Знатно попотел.



  • Участник @artemv написал в Javascript: Коллекция с альбомами (JS 91):

    function updateRecords(id, prop, value) {
    if (collection[id].tracks !== prop && value !== "") {
    collection[id].prop = value;
    } else if (collection.hasOwnProperty['track'] === false && prop === "tracks") {
    collection[id].tracks.push(value);
    } else if (prop === "track" && value !== "") {
    collection[id].prop = value;
    } else if (value === "") {
    delete collection[id].prop;
    };
    return

    Ну не работает этот код тоже



  • if (prop !== "tracks" && value !== "") {
    collection[id][prop] = value;
    } else if (prop === "tracks" && collection[id].hasOwnProperty("tracks") === false) {
    var arr = [];
    collection[id][prop] = arr;
    arr.push(value);
    } else if (prop === "tracks" && value !== '') {
    collection[id][prop].push(value);
    } else if (value === '') {
    delete collection[id][prop];
    }
    return collection;
    }



  • Получилось!!!!
    function updateRecords(id, prop, value) {
    if (value === ""){
    delete collectionCopy[id][prop];
    } else if (prop === "tracks"){
    if (!collectionCopy[id].hasOwnProperty(prop)){
    collectionCopy[id][prop] = [];
    }
    collectionCopy[id][prop].push(value);
    }else{
    collectionCopy[id][prop] = value;
    }
    return collectionCopy;
    }



  • Так как я новенький, и мне вроде как интересно, пробовал извращаться и со switch'ом.
    К сожалению, отношения с ним не сложились, один из тестов он не хотел решать. В прочем, это и понятно, ведь switch хорош только там, где нет кучи условий. А так, вот, если кому надо:

    function updateRecords(id, prop, value) {  
    var valid = collection[id].hasOwnProperty(prop);  
     if ( value === "") {    
        delete collection[id][prop];  
      } else if (prop === "tracks") {
        if (!valid) {      
          collection[id][prop] = [];
        }                              
        collection[id][prop].push(value);     
      } else {    
        collection[id][prop] = value;
      }
      return collection;
    }


Похоже, подключение к Форум DoCode было разорвано, подождите, пока мы пытаемся восстановить соединение.