Мы пишем функцию, которая изменяет объект JSON, содержащий несколько музыкальных записей.

Сегодня мы собираемся написать функцию с именем updateRecords, которая будет принимать одно целое число (id) и две строки (prop и value) в качестве аргументов.

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

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"
    }
};

Цель функции - изменить данные JSON выше, используя заданные входные данные функции, и вернуть весь объект коллекции. ID относится к номеру идентификатора каждой записи, prop - это свойство объекта внутри этого идентификатора, а value - значение, связанное с этим prop.

Вот несколько правил, которым нужно следовать при работе со свойствами, которые не существуют, или свойствами объекта, которые имеют пустое значение.

Если prop = "tracks", но альбом в конкретном ID не имеет свойства tracks, создайте пустой массив перед добавлением нового value в массив.

Если prop = "tracks" и в альбоме уже есть свойство tracks и существующий массив значений, поместите value в конец существующего массива.

Если value пусто (""), удалите данное свойство prop из альбома.

Если prop - другое свойство, отличное от tracks, обновите или установите value для свойства этого альбома записи.

Приступим к написанию нашего кода.

Поскольку наш объект назначен переменной, мы будем обращаться к свойствам объекта с помощью скобок.

Мы собираемся написать серию операторов if-else. Используя приведенные выше правила, мы пишем наш первый оператор if. Это проверяет, равно ли заданный prop tracks, и проверяет, не имеет ли альбом в заданном ID в нашем collections объекте свойство tracks.

if(prop === "tracks" && !collection[id].hasOwnProperty([prop])){
    collection[id][prop] = [];
    collection[id][prop].push(value);
}

Мы проверяем, есть ли у объекта свойство, используя метод hasOwnProperty(). Это возвращает либо true, либо false, если свойство существует.

Если это утверждение верно, что означает, что свойство tracks не существует, мы создаем новое свойство и даем ему пустой массив. После этого мы помещаем наш заданный value в этот массив.

В нашем операторе else-if мы проверяем, равно ли данное prop tracks, и проверяем, имеет ли объект collections уже существующее свойство tracks. Если это так, мы просто помещаем заданный value в конец существующего массива.

else if(prop === "tracks" && collection[id].hasOwnProperty([prop])){
    collection[id][prop].push(value);
}

В нашем последнем операторе else для всех остальных свойств обновите или установите value для свойства этого альбома записи.

else{
    collection[id][prop] = value;
}

Вот полный блок операторов if-else:

if (prop === "tracks" && !collection[id].hasOwnProperty([prop])) {
    collection[id][prop] = [];
    collection[id][prop].push(value);
} else if (prop === "tracks" && collection[id].hasOwnProperty([prop])) {
    collection[id][prop].push(value);
} else {
    collection[id][prop] = value;
}

Мы пишем последний if-оператор, который проверяет, является ли заданный value пустой строкой. Если это так, мы удаляем данное свойство prop из объекта альбома.

if(!value){
    delete collection[id][prop];
}

После того, как функция завершит изменение объекта коллекций, мы его возвращаем.

return collection;

Вот полный код:

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

Если вы нашли этот алгоритм полезным, ознакомьтесь с другими моими решениями для алгоритмов JavaScript: