Перебор данных для сравнения значений

#jquery

#jquery ( jquery )

Вопрос:

У меня есть объект с данными в формате:

 {
    "genres": [{
        "genreId": 1,
        "genre": "Horror",
        "publishers": [{
            "publisher": "Random House",
            "authors": [{
                "author": "Stephen King",
                "publishedYears": [2010, 2011]
            }]
        }, {
            "publisher": "Penguin",
            "authors": [{
                "author": "William Shakespeare",
                "publishedYears": [2004, 2006]
            }]
        }]
    }]
}
  

Я пытаюсь добавить данные в соответствующие разделы, чтобы из выпадающего списка я мог выбрать издателя или автора.
Итак, я выбираю Random House, а затем автора «Джейн Смит», я хочу добавить ее в раздел Random house, чтобы это выглядело так:

     {
        "publisher": "Random House",
        "authors": [{
            "author": "Stephen King",
            "publishedYears": [2013, 2014],
        }, {
            "author": "Jane Smith",
            "publishedYears": [2013],
        }]
    }
  

В данный момент я делаю:

 $('#addAuthor').on('click', function () {
    var obj = sender.data('obj');
    var publisher = $('#pubdropdown').val();
    var author = $('#authordropdown').val();
    var newObj = [];
    newObj.push({
        'publisher': publisher,
        'authors': [{
            'author': author,
            'publishedYears': []
        }]
    });
})
  

Но каждый раз это просто добавление еще одной записи, так что в итоге я получаю 2 записи Random House.

Итак, я знаю, что мне нужно просмотреть ‘obj’ и проверить его, чтобы узнать, существует ли издатель, если он просто нажимает элемент author. Однако как я могу проверить значение obj на соответствие newObj, когда newObj не существует, пока он уже не был нажат?

Я пробовал что-то вроде:

 for (i = 0; i < data.genres.length; i  ) {
    for (j = 0; j < data.genres[i].publishers.length; j  ) {
        if (data.genres[i].publishers[j].publisher == newObj.publisher) {
            //push author only
        } else {
            newObj.push({
                'publisher': publisher,
                'authors': [{
                    'author': author,
                    'publishedYears': []
                }]
            });
        }
    }
}
  

Комментарии:

1. Разве вы не можете просто проверить переменную publisher, которую вы устанавливаете внутри newObj? Вы должны знать издателя, которого ищете?

Ответ №1:

 for (i = 0; i < data.genres.length; i  ) {
    for (j = 0; j < data.genres[i].publishers.length; j  ) {
        if (data.genres[i].publishers[j].publisher === newObj[0].publisher) {
            data.genres[i].publishers[j].authors.push({
                'author': newObj[0].authors[0].author,
                'publishedYears': []
            });
        } else {
            data.genres[i].publishers.push(newObj[0]);
        }
        break;
    }
}
  

JSFiddle (проверка объекта в консоли)