Как я могу добавить объект внутри другого объекта (NodeJS, Axion, Cheerio, jQuery, JSON) - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь выучить Axion & Cheerio, используя NodeJS для веб-скрейпинга ... У меня все было хорошо, пока я не наткнулся на проблему, пытаясь сохранить полученные данные в файл JSON. Я всегда боролся с массивами, объектами и форматированием JSON файлов ... Я был бы очень признателен, если бы кто-нибудь мог мне помочь и, возможно, связать некоторые полезные источники по этому вопросу.

Вот код который я сейчас использую:

    if (response.status === 200) {
            const html = response.data;
            let $ = cheerio.load(html);
            const data = {
                animes: {
                    details: [],
                    episodes: []
                }
            };
            $('.item').each(function (i) {
                data.animes.details.push({
                    id: i - 3,
                    title: $(this).children('.inner').children('.name').text().trim(),
                    url: $(this).children('.inner').children('.name').prop('href'),
                    poster: $(this).children('.inner').children('.poster').children('img').prop('src')
                });

                data.animes.episodes.push({
                    episode: $(this).children('.inner').children('a').children('.status').children('.ep').text().trim()
                });
            });

            data.animes.details = data.animes.details.slice(4, -21);

            fs.writeFile('data/animes.json',
                JSON.stringify(data, null, 4), (err) => {
                    console.log('File successfully written!');
                });
        }

В настоящее время мой JSON файл выглядит примерно так:

{
    "weeb": {
        "details": [
            {
                "id": 1,
                "title": "Some title 1",
                "url": "https://placeholder.com",
                "poster": "https://lets-imagine-a-picture.com/picture01.jpg"
            },
            {
                "id": 2,
                "title": "Some title 2",
                "url": "https://placeholder.com",
                "poster": "https://lets-imagine-a-picture.com/picture01.jpg"
            }
        ],
        "episodes": [
            {
                "episode": "3/12"
            },
            {
                "episode": "13/32"
            }
        ]
    }
}

Я хочу, чтобы мой JSON файл выглядел так:

{
    "weeb": {
        "details": [
            {
                "id": 1,
                "title": "Some title 1",
                "url": "https://placeholder.com",
                "poster": "https://lets-imagine-a-picture.com/picture01.jpg",
                "episodes": [
                    {
                        "episode-01": "https://some-nifty-link.com/episode01",
                        "episode-02": "https://some-nifty-link.com/episode02",
                        ...
                    }
                ]
            },
            {
                "id": 2,
                "title": "Some title 2",
                "url": "https://placeholder.com",
                "poster": "https://lets-imagine-a-picture.com/picture01.jpg",
                "episodes": [
                    {
                        "episode-01": "https://some-nifty-link.com/episode01",
                        "episode-02": "https://some-nifty-link.com/episode02",
                        ...
                    }
                ]
            }
        ]
    }
}

1 Ответ

1 голос
/ 11 февраля 2020

См. Пример ниже. L oop через внутренние дочерние элементы и pu sh найденный объект попадает в индекс массива data.animes.details[i] в объекте episodes. Я не думаю, что это самое аккуратное решение. Но если ключ детей правильный, он должен работать.

    if (response.status === 200) {
            const html = response.data;
            let $ = cheerio.load(html);
            const data = {
                animes: {
                    details: [],
                }
            };
            $('.item').each(function (i) {
                data.animes.details.push({
                    id: i - 3,
                    title: $(this).children('.inner').children('.name').text().trim(),
                    url: $(this).children('.inner').children('.name').prop('href'),
                    poster: $(this).children('.inner').children('.poster').children('img').prop('src')
                });

                $(this).children('.inner').each(function (j) {
                  data.animes.details[i].episodes.push({
                    episode: $(this).children('.inner').children('a').children('.status').children('.ep').text().trim()
                  });
                });
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...