Обработка json
Добрый день, есть ajax запрос:
$.ajax({
type: "POST",
url: "http://geotest/ajax.php",
data: { centerDist:centerDistance,pointDist:pointsDistance },
success: function(msg){
}
});
который посылает некие данные на обработку в php, после обработки они возвращаются вот в таком виде:
{"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]]},{"path":["C","C11","C"],"point":{"4":["49.3284","31.1077"]}}],
"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]]},{"path":["D","D10","D"],"point":{"4":["50.0695","33.7004"]}}],
"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]]}],
"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]]}]}
Подскажите как можно вытащить все значения поля "point" ? |
msg.C[1]или msg['C'][1] |
Цитата:
но там еще проблема в том, что буквы могут быть разными |
Dark19, что мешает пройтись циклом, если вложенность известна?
|
Dark19,
:blink:
var msg = {
"C": [{
"path": ["C", "C3", "C8", "C2", "C12", "C"],
"point": [
["48.5515", "29.5915"],
["45.729", "29.7453"],
["48.0188", "31.0637"],
["47.6686", "32.404"]
]
}, {
"path": ["C", "C11", "C"],
"point": {
"4": ["49.3284", "31.1077"]
}
}],
"D": [{
"path": ["D", "D7", "D5", "D4", "D14", "D"],
"point": [
["48.039", "38.2796"],
["47.1016", "35.2604"],
["48.6972", "35.7438"],
["50.0099", "37.1602"]
]
}, {
"path": ["D", "D10", "D"],
"point": {
"4": ["50.0695", "33.7004"]
}
}],
"A": [{
"path": ["A", "A0", "A13", "A1", "A"],
"point": [
["51.5378", "33.5307"],
["50.3561", "32.1842"],
["50.2153", "29.5036"]
]
}],
"B": [{
"path": ["B", "B9", "B6", "B"],
"point": [
["50.8827", "25.3508"],
["50.039", "25.2796"]
]
}]
}
function fn(data)
{
Object.keys(data).forEach(function (key) {
alert(data[key][0]["point"])
});
}
fn(msg)
|
рони,
у меня почему-то пишет undefined и все |
Dark19,
смотрите что вы получили в msg |
Цитата:
{"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]]},{"path":["C","C11","C"],"point":{"4":["49.3284","31.1077"]}}],"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]]},{"path":["D","D10","D"],"point":{"4":["50.0695","33.7004"]}}],"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]]}],"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]]}]}
больше нет ничего |
Dark19,
может вы забыли распарсить? JSON.parse(msg)['C'][1]; Читайте $.ajax dataType: 'json' |
рони,
Может я не так пишу что-то?
$.ajax({
type: "POST",
url: "http://geotest/ajax.php",
data: { centerDist:centerDistance,pointDist:pointsDistance },
success: function(msg){
console.log(msg);
function fn(data)
{
Object.keys(data).forEach(function (key) {
console.log(data[key][0]["point"])
});
}
fn(msg);
}
});
|
Цитата:
|
Цитата:
|
рони,
ну если консоль все выводит верно, и у msg нет свойств и ключей к которым мы обращаемся, то либо автор что-то напутал, либо msg - строка, нет? 1 потому что C[0] - это 'path', а нужен 'point' |
:-?
$.ajax({
dataType: "json",
type: "POST",
url: "http://geotest/ajax.php",
data: {
centerDist: centerDistance,
pointDist: pointsDistance
},
success: function(msg) {
console.log(msg);
Object.keys(msg).forEach(function(key) {
console.log(msg[key][0]["point"])
});
}
});
|
рони,
dataType: "json", - у автора не указан. |
Цитата:
|
рони,
сделал msg = JSON.parse(msg); начало выводить массивы с точками только не могу понять почему тут data[key][0]["point"] стоит 0 - это подразумевается буква (A,B,C...), типа первый элемент массива? Как можно вывести не массивами, а каждую точку отдельно? |
Dark19,
data[key] == data["A"] условно -- далее смотрите согласно вашей структуре |
Цитата:
|
Цитата:
Object.keys(data).forEach(function (key) {
var p = 0, x = 0;
for(p=0;p<data[key].length;p++){
console.log(data[key][p]['point']);
for(x;x<data[key][p]['point'].length;x++){
console.log(data[key][p]['point'][x]);
}
}
});
выводит нормально, но вот там где в массиве только один элемент не выводит ничего. Что не так делаю? |
как вариант http://jsfiddle.net/41qp5hua/
|
Цитата:
{
"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]],"pointCenter":[["48.4931","32.2721"]]},{"path":["C","C11","C"],"point":[["49.3284","31.1077"]],"pointCenter":[["48.4931","32.2721"]]}],
"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]],"pointCenter":[["49.5623","34.5573"]]},{"path":["D","D10","D"],"point":[["50.0695","33.7004"]],"pointCenter":[["49.5623","34.5573"]]}],
"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]],"pointCenter":[["50.4404","30.5582"]]}],
"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]],"pointCenter":[["49.3905","27.0426"]]}]
}
а почему мой цикл не выводит там где только один элемент в массиве, ведь его длина =1, а цикл начинает считать с 0? |
Dark19,
<script>
var msg = {
"C": [{
"path": ["C", "C3", "C8", "C2", "C12", "C"],
"point": [
["48.5515", "29.5915"],
["45.729", "29.7453"],
["48.0188", "31.0637"],
["47.6686", "32.404"]
],
"pointCenter": [
["48.4931", "32.2721"]
]
}, {
"path": ["C", "C11", "C"],
"point": [
["49.3284", "31.1077"]
],
"pointCenter": [
["48.4931", "32.2721"]
]
}],
"D": [{
"path": ["D", "D7", "D5", "D4", "D14", "D"],
"point": [
["48.039", "38.2796"],
["47.1016", "35.2604"],
["48.6972", "35.7438"],
["50.0099", "37.1602"]
],
"pointCenter": [
["49.5623", "34.5573"]
]
}, {
"path": ["D", "D10", "D"],
"point": [
["50.0695", "33.7004"]
],
"pointCenter": [
["49.5623", "34.5573"]
]
}],
"A": [{
"path": ["A", "A0", "A13", "A1", "A"],
"point": [
["51.5378", "33.5307"],
["50.3561", "32.1842"],
["50.2153", "29.5036"]
],
"pointCenter": [
["50.4404", "30.5582"]
]
}],
"B": [{
"path": ["B", "B9", "B6", "B"],
"point": [
["50.8827", "25.3508"],
["50.039", "25.2796"]
],
"pointCenter": [
["49.3905", "27.0426"]
]
}]
}
function fn(data)
{
Object.keys(data).forEach(function (key) {
data[key].forEach(function(el,i) {
document.write(key + " " + i + " " +JSON.stringify(el["point"])+ "<br>")
})
})};
fn(msg)
</script>
|
Цитата:
|
Цитата:
|
Цитата:
|
рони,
спасибо, работает отлично. А есть возможность прокручивать элементы массива внутри свойств функции? Например есть функция вывода точек на карту ymaps.route к ней в свойства передаются элементы из массива. Первая точка и последняя статические(их нужно вывести один раз при обходе каждого массива), а вот промежуточные точки type: 'viaPoint' нужно вывести все из массива. То есть результат должен получится такой: начальная точка el['pointCenter'][0] потом вывод всех точек из массива C->0 потом конечная точка el['pointCenter'][0], el['pointCenter'][0] потом вывод всех точек из массива C->1 потом конечная точка el['pointCenter'][0], el['pointCenter'][0] потом вывод всех точек из массива D->0 потом конечная точка el['pointCenter'][0] и т.д. Можно ли такое сделать и как? Вот код:
function fn(data)
{
Object.keys(data).forEach(function (key) {
var p = 0, x = 0;
data[key].forEach(function(el,i) {
console.log(el["point"]);
for(p=0;p<el['point'].length;p++){
ymaps.route([
el['pointCenter'][0],
{
type: 'viaPoint',
point: el['point'][p]
},
el['pointCenter'][0]
]).then(
function (route) {
myMap.geoObjects.add(route);
},
function (error) {
alert("Возникла ошибка: " + error.message);
}
);
}
});
});
}
fn(msg);
|
Цитата:
|
| Часовой пояс GMT +3, время: 15:47. |