Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.06.2020, 14:15
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Помогите ламеру распарсить json
Привет, сто лет не связывался с js, но тут прижало..
Суть такая: кидаю ajax'ом запрос, получаю данные. Их нужно распарсить.
Приходит json такого типа:

Код:
"data": [
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:42:19.3200000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:42:35.8000000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:43:16.3770000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:45:22.4430000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 56.8586421,
            "lon": 60.5508243,
            "dateTime": "2020-06-10 14:06:28.2400000",
            "user": {
                "id": 3,
                "username": "Вега",
                "phone": "222"
            },
            "isGpsEnable": 1,
            "isNetworkEnable": 1
        },
        {
            "lat": 56.8586421,
            "lon": 60.5508243,
            "dateTime": "2020-06-10 14:06:35.6000000",
            "user": {
                "id": 3,
                "username": "Вега",
                "phone": "222"
            },
            "isGpsEnable": 1,
            "isNetworkEnable": 1
        }
    ]
}
Т.е. фигурируют 2 юзера: Вега и Viktor. Их число может быть разным, от 1го до N.
Мне нужно неизвестным мне способом распарсить данные так, что бы "нарисовать" таблицу, в которую засунуть всех пользователей с их данными, а координаты этих пользователей выкинуть на карту. То-есть как на карту добавлять координаты я знаю, мне нужна помощь со структурированием данных. То-есть нужно получить видимо 2 каких-то структуры типа массивов, которые между собой как-то связаны ? Или как лучше это сделать ?
Надеюсь суть донес и задача понятна
Ответить с цитированием
  #2 (permalink)  
Старый 13.06.2020, 14:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

А можно узнать как на сервере получаются эти данные и почему эти два пользователя в ответе имеют кучу дубликатов?
Ответить с цитированием
  #3 (permalink)  
Старый 13.06.2020, 16:57
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Сервер работает на spring'e, почему именно так выплевывает я не знаю
Ответить с цитированием
  #4 (permalink)  
Старый 13.06.2020, 16:59
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Еще вопрос:
Сделал массив:
0: {id: 1, username: "Viktor", phone: "9221307231"}
1: {id: 1, username: "Viktor", phone: "9221307231"}
2: {id: 1, username: "Viktor", phone: "9221307231"}
3: {id: 1, username: "Viktor", phone: "9221307231"}
4: {id: 3, username: "Вега", phone: "9221307233"}
5: {id: 3, username: "Вега", phone: "9221307233"}


Сделал функцию:
function inArray(array, name) {
    $.each(array, function(i, e) {
 
        if(e.username == name) {
            return true;
        }
 
    });
 
    return false;
}


Почему console.log(inArray(usersArray, "Viktor")); всегда возвращает false ? Вставлял в блок if вывод console.log - в этот блок функция входит, но return true; почему-то функцию не останавливает.
Что я не так делаю ?
Ответить с цитированием
  #5 (permalink)  
Старый 13.06.2020, 17:13
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от lolka84
Сделал массив:
Вообще сервер уже должен отдавать:

"data": [
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:42:19.3200000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 56.8586421,
            "lon": 60.5508243,
            "dateTime": "2020-06-10 14:06:35.6000000",
            "user": {
                "id": 3,
                "username": "Вега",
                "phone": "222"
            },
            "isGpsEnable": 1,
            "isNetworkEnable": 1
        }
    ];


и все, без дубликатов, и никаких преобразований в промежуточный объект для получения из него данных не требуется. А в том, что он у вас возвращает нужно проверять, выбирали уже такое или нет нет, так как у вас данные о "Viktor" повторяются четыре раза, а о "Вега" дважды. Это вообще на какой-то бред похоже.

Последний раз редактировалось laimas, 13.06.2020 в 17:16.
Ответить с цитированием
  #6 (permalink)  
Старый 13.06.2020, 17:48
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Это тестовые данные, в реальных условиях конечно же одинаковых координат не будет
Но то, что у каждого пользователя будет именно пачка координат - от этого никуда не деться.
По функции подскажите все-таки, почему она все время false ?
Ответить с цитированием
  #7 (permalink)  
Старый 13.06.2020, 17:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

То есть, возьмем так. У вас "data", это свойство некоего объекта, а в примере оно как массив объектов под переменной data. Если из такого объекта нужно получить уникальные данные, а не запросом по известному, то нужно до цикла объявить переменную, которая будет хранить уникальный признак (id). В цикле ее значение проверяется со значением этого же свойства из данных и если не равны, то вывод и сохранение его в переменной.

var data = [
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:42:19.3200000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:42:35.8000000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:43:16.3770000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 65.56,
            "lon": 56.56,
            "dateTime": "2020-06-10 10:45:22.4430000",
            "user": {
                "id": 1,
                "username": "Viktor",
                "phone": "111"
            },
            "isGpsEnable": 0,
            "isNetworkEnable": 0
        },
        {
            "lat": 56.8586421,
            "lon": 60.5508243,
            "dateTime": "2020-06-10 14:06:28.2400000",
            "user": {
                "id": 3,
                "username": "Вега",
                "phone": "222"
            },
            "isGpsEnable": 1,
            "isNetworkEnable": 1
        },
        {
            "lat": 56.8586421,
            "lon": 60.5508243,
            "dateTime": "2020-06-10 14:06:35.6000000",
            "user": {
                "id": 3,
                "username": "Вега",
                "phone": "222"
            },
            "isGpsEnable": 1,
            "isNetworkEnable": 1
        }
    ];


var id = 0;

data.forEach( (d) => {
    if(id != d.user.id) {
        id = d.user.id;
        console.log(
            'Name: ' + d.user.username +
            ', Phone: ' + d.user.phone +
            ', Latitude: ' + d.lat +
            ', Longitude: ' + d.lon +
            ', Time: ' + Date.parse(d.dateTime) + ' or ' + d.dateTime.match(/.+(?=\.)/)
        )
    }    
});


В примере вывод в консоль.
Ответить с цитированием
  #8 (permalink)  
Старый 13.06.2020, 17:56
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Да, я примерно так и сделал

var usersArray = [];
            var username;

            $.each(data.data, function(index, e) {

                if(username != e.user.username) {
                    username = e.user.username;
                
                    usersArray.push(
                        e.user
                    );

                }
                
            });
Ответить с цитированием
  #9 (permalink)  
Старый 13.06.2020, 18:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от lolka84
я примерно так и сделал
Строго говоря, так, это не верно. Что вы пытаетесь в таких данных найти? У вас данные, строго говоря "бракованные", они имеют дубликаты. А имя e.user.username никак не может служить гарантией уникальности (если только речь не о логинах, уникальность которых забота сервера), а значит в usersArray опять попадут дубликаты. Уникальное значение, которое обеспечивается базой, это id, его и нужно сравнивать.

Последний раз редактировалось laimas, 13.06.2020 в 18:10.
Ответить с цитированием
  #10 (permalink)  
Старый 13.06.2020, 18:15
Кандидат Javascript-наук
Отправить личное сообщение для lolka84 Посмотреть профиль Найти все сообщения от lolka84
 
Регистрация: 23.08.2010
Сообщений: 123

Согласен, уже понял это.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распарсить JSON ar4ipers Общие вопросы Javascript 3 23.04.2018 20:10
Помогите выбрать: JQuery, JSON или AJAX? Apollo9 Библиотеки/Тулкиты/Фреймворки 4 14.04.2017 02:44
Помогите. обработка JSON ответа heyBro AJAX и COMET 1 14.10.2015 14:49
Распарсить JSON gorenie AJAX и COMET 3 29.01.2014 17:14
Не могу распарсить JSON. gorenie jQuery 3 29.11.2013 22:26