Вход

Просмотр полной версии : Помогите разобрать JSON


smart-create
14.11.2017, 12:05
Добрый день. В ответе от сервера имеется вот такой JSON


{
card: 10000013
code: 752
dt: "2017-11-20 18:03:00"
id: 903398
notifies: Array(3)
0:{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0}
1:{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0}
2:{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}
notify: {id: 10, code: 752, caption: "Брюшная полость", info: "Вы записаны на Брюшная полость. За 6 часов до этог…ния нельзя принимать пищу, за 4 часа нельзя пить."}

price: {id: 101850, code: 752, name: "Черевна порожнина", nameRu: "УЗИ брюшной полости (дети)", text: "", …}
sended_at:null
}


Это уведомление о записи на прием. Из этого всего мне нужны значения которые находятся внутри массива notifies.

Сложность в том что таких уведомлений может быть с десяток за раз.
Самый простой способ прогнать ответ от сервера через несколько циклов for и таким образом достучатся до значений в notifies, но при условии что таких уведомлений может быть больше 10 такой цикл станет настоящим адом для устройства клиента.

Подскажите пожалуйста как сделать это более лаконично? Быть может есть способ вырезать из всего ответа параметры которые находятся в notifies и запихнуть в отдельный массив, то есть что бы получилось вот так:


{
{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0}
{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0}
{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}
//.... и т.д.
}

Nexus
14.11.2017, 12:14
        notifies: Array(3)
                0:{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0}
                1:{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0}
                2:{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}

Что за формат данных?
json + php print_r?

smart-create
14.11.2017, 12:27
Nexus, это из консоли вывод. То есть json + console.log()

http://prntscr.com/ha8j77

smart-create
14.11.2017, 12:28
вот пример (http://prntscr.com/ha8j77)

Nexus
14.11.2017, 12:34
smart-create, получить массив массивов "notifies" можно так:
json=json.map(function(item){return item.notifies;});
console.log(json);
//Далее объединяю массивы "notifies"
json=[].concat.apply([],json);
console.log(json);

smart-create
14.11.2017, 12:46
Nexus, Большое спасибо. Но это пока всех проблем не решает, у меня выходит вот такая структура

результат (http://prntscr.com/ha8pzh)

Но мне по сути не нужны все эти массивы в которых еще по n массивов. Существует ли способ свести это все до одного единственного массива в котором будет просто список json объектов?

То есть в моем случае, вот так:


{
{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0}
{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0}
{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}
//.... и т.д.
}

Nexus
14.11.2017, 12:48
smart-create, смотрите пост №5 (https://javascript.ru/forum/events/71378-pomogite-razobrat-json.html#post470031)

smart-create
14.11.2017, 13:14
Nexus, большое спасибо, много нового для меня открыли.

Хочу попросить еще с одним, последним вопросом, помочь. Мне нужно из исходного массива (https://prnt.sc/ha8j77), вытащить объект notify и его значение info,
вот оно (http://prntscr.com/ha93a2) и запихнуть его в то что получается после всех манипуляций. То есть вот так (http://prntscr.com/ha94h6)

smart-create
14.11.2017, 13:16
У меня есть идея как это сделать с помощью костылей и циклов, но похоже для этого есть куча методов о которых я ранее не знал(

Nexus
14.11.2017, 13:19
smart-create, попробуйте так:
json=[].concat.apply([],json.map(function(item){
return item.notifies.map(function(obj){
obj.info=item.notify.info;

return obj;
});
}));
console.log(json);

smart-create
14.11.2017, 13:46
Nexus, Попробовал на всякий случай но как и ожидал получилась ошибка. дело в том что это скрипте мы пытаемся получить notify из массива notifies, а его там не было изначально.

В исходном массиве (https://prnt.sc/ha8j77) они лежат на одном уровне, вот (http://prntscr.com/ha9gws).

Я так понимаю что действия с ним нужно произвести на этапе:


arr = arr.map(function(item){
return item.notifies;
});


То есть если вместо это сделать вот так:

arr = arr.map(function(item){
return item.notify.info;
});

То мы получим нужное значение info.

Может есть способ взять это значение и воткнуть его в item.notifies, по аналогии с .push() в массивах?

Nexus
14.11.2017, 13:51
smart-create,
var json=[{
card: 10000013,
code: 752,
dt: "2017-11-20 18:03:00",
id: 903398,
notifies:[
{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0},
{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0},
{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}],
notify: {id: 10, code: 752, caption: "Брюшная полость", info: "Вы записаны на Брюшная полость. За 6 часов до этог…ния нельзя принимать пищу, за 4 часа нельзя пить."},
price: {id: 101850, code: 752, name: "Черевна порожнина", nameRu: "УЗИ брюшной полости (дети)", text: ""},
sended_at:null
},{
card: 10000013,
code: 752,
dt: "2017-11-20 18:03:00",
id: 903398,
notifies:[
{id: 9161, sended_at: "2017-11-14 09:28:46", params: 0},
{id: 9162, sended_at: "2017-11-18 18:03:00", params: 0},
{id: 9163, sended_at: "2017-11-20 16:03:00", params: 0}],
notify: {id: 10, code: 752, caption: "Брюшная полость", info: "Вы записаны на Брюшная полость. За 6 часов до этог…ния нельзя принимать пищу, за 4 часа нельзя пить."},
price: {id: 101850, code: 752, name: "Черевна порожнина", nameRu: "УЗИ брюшной полости (дети)", text: ""},
sended_at:null
}];
json=[].concat.apply([],json.map(function(item){
return item.notifies.map(function(obj){
obj.info=item.notify.info;

return obj;
});
}));
console.log(json);

smart-create
14.11.2017, 15:37
Nexus, Все понял, большое спасибо, теперь мои отношения с JSON станут приятнее:dance: