1. Telegram чат для обсуждения работы JS парсеров и Node.js модулей: https://t.me/a_parser_javascript
  2. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Проблема с объектом

Тема в разделе "Техническая поддержка по JavaScript парсерам", создана пользователем Dmitron, 27 сен 2021.

  1. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Помогите пожалуйста! Весь мозг сломал :)

    Есть такой массив

    {"pass":{"length":9,"values":["c19283374","Audi100"]},"email":{"length":16,"values":["[email protected]","[email protected]"]},"__infos__":{"count":2,"table":"My_User","db":"qwerty123"}}

    Мне нужно исключить __infos__ и взять строки из pass и email (названия этих ключей могут меняться!!)
    Но не просто взять, а сопоставить емейл и пароль и положить друг с другом через разделитель :

    В результате нужно

    [email protected]:c19283374
    [email protected]:Audi100

    Буду премного благодарен!
     
  2. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    Это нужно сделать в JS парсере или шаблонизатором в обычном пресете?
    Размер массивов pass.values и email.values всегда совпадает?
     
  3. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Я пишу JS парсер для своего сайта.
    values совпадают, но могут быть пустые значения.
     
  4. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    В этом обьекте всегда аналогичная структура? Т.е. 3 ключа, среди которых __infos__ и два с заранее неизвестными именами. И каждый из этих неизвестных ключей содержит в себе массив values - верно? Если да, то как понять что считать почтой (выводить в списке первым), а что паролем (выводить вторым)?
     
  5. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Структура всегда аналогичная примеру.

    Определить почта или пароль можно вхождением букв, которое всегда будут содержаться в имени ключа.

    Для почты это mail
    Для пароля pass
     
  6. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    Код:
        let json = {"pass":{"length":9,"values":["c19283374","Audi100"]},"email":{"length":16,"values":["[email protected]","[email protected]"]},"__infos__":{"count":2,"table":"My_User","db":"qwerty123"}};
        
        // исключаем __infos__
        delete json['__infos__']
    
        // ищем имена ключей
        let mailKey, passKey;
        for(let item of Object.keys(json)) {
            if(/mail/.test(item))
                mailKey = item;
            else if(/pass/.test(item))
                passKey = item;
        }
    
        // выводим результат
        if(!mailKey || !passKey) {
            this.logger.put('Error');
        } else {
            for(let i = 0; i < json[mailKey].values.length; i++) {
                this.logger.put(json[mailKey].values[i] + ';' + json[passKey].values[i]);
            }
        }
     
    Dmitron нравится это.
  7. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    То что нужно!
    Огромное спасибо за помощь и самый лучший парсер, который я знаю!
     
  8. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Всё же один момент остался в этом коде.

    Код:
        for(let item of Object.keys(json)) {
            if(/mail/.test(item))
                mailKey = item;
            else if(/pass/.test(item))
                passKey = item;
        }
    Оказалось, что структура не всегда одинаковая.
    Бывают похожие ключи, например email, email_to, sendEmail
    Но не в каждом есть values с емейлами.
    Можно как то проверить на наличие знака @ в values и брать только тот ключ, который содержит этот символ?

    Пробовал добавить такую проверку, но не помогло.

    Код:
                                if(/@/.test(item['values'])){
                                
                                    mailKey = item;
                                
                                }
     
  9. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    Как-то так примерно:
    Код:
    for(let item of Object.keys(json)) {
        if(!mailKey && json[item].values) {
            for(let value of json[item].values) {
                if(/@/.test(value)) {
                    mailKey = item;
                    break;
                }
            }
        } else if(/pass/.test(item)) {
            passKey = item;
        }
    }
     
    Dmitron нравится это.

Поделиться этой страницей