Мы пишем функцию, которая изменяет объект 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: