JSON для массива javaScript
У меня возникла проблема с обработкой JSON-данных в JavaScript, особенно в отношении использования данных в виде массива, а также для доступа и итерации по отдельным значениям. Файл JSON структурирован следующим образом:
{
"head": {
"vars": [ "place" , "lat" , "long" , "page" ]
} ,
"results": {
"bindings": [
{
"place": { "type": "literal" , "value": "Building A" } ,
"lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "10.3456" } ,
"long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-1.2345" } ,
"page": { "type": "uri" , "value": "http://www.example.com/a.html" }
} ,
{
"place": { "type": "literal" , "value": "Building B" } ,
"lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "11.3456" } ,
"long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-2.2345" } ,
"page": { "type": "uri" , "value": "http://www.example.com/b.html" }
} ,
{
"place": { "type": "literal" , "value": "Building C" } ,
"lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "12.3456" } ,
"long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-3.2345" } ,
"page": { "type": "uri" , "value": "http://www.example.com/c.html" }
}
]
}
}
Я хочу, чтобы иметь возможность преобразовать это в массив JavaScript следующим образом, чтобы я мог выполнить итерацию по нему и вытащить значения для каждого местоположения в порядке:
var locations = [
['Building A',10.3456,-1.2345,'http://www.example.com/a.html'],
['Building B',11.3456,-2.2345,'http://www.example.com/b.html'],
['Building C',12.3456,-3.2345,'http://www.example.com/c.html']
];
Есть ли у кого-нибудь советы о том, как достичь этого? Я пробовал следующее, но он выбирает "тип" внутри JSON, а не только значение:
$.each(JSONObject.results.bindings, function(i, object) {
$.each(object, function(property, object) {
$.each(object, function(property, value) {
value;
});
});
});
Любая помощь, предложения, советы или исправления были бы оценены.
Ответы
Ответ 1
var locations = [];
$.each(JSONObject.results.bindings, function(i, obj) {
locations.push([obj.place.value, obj.lat.value, obj.long.value, obj.page.value]);
});
Перейдите через bindings
и поместите свойства place.value
, lat.value
, long.value
и page.value
из каждого элемента в массив, затем добавьте этот массив в locations
.
В вашем текущем коде используется object
дважды, а также property
, тем самым перезаписывая эти переменные. Вы должны использовать уникальные имена переменных в вложенных циклах, чтобы иметь возможность различать их.
Ответ 2
для чистого Javascript, очень похожего на принятый ответ (который мне нравится)
Мне нравится использовать отрицательный цикл while для скорости (в традиционном для цикла), когда у меня определенная длина. Это скорее всего быстрее, чем ответ jQuery.
var i = JSONObject.results.bindings.length;
var locations = [];
while (i--) {
t = JSONObject.results.bindings[i];
locations.push([t.place.value, t.lat.value, t.long.value, t.page.value]);
};
//now show the places
var c = locations.length;
while (c--) {
alert(locations[c][0]);
};
Вот скрипка, демонстрирующая: http://jsfiddle.net/MarkSchultheiss/JH7LR/
EDIT: Обновлен пример скрипта, чтобы вставить материал в div.
(использует небольшой jQuery, который не был частью вопроса OP, поэтому он "добавил материал" делает предположение, что у вас есть <div id='holdem'></div>
где-то.
$(locations).each(function(i) {
$('#holdem').prepend("<div>" + $(this)[0] + " Is at:" + this + "</div>");
});
Для некоторой забавы я обновил скрипту, чтобы показать название здания как ссылку на страницу здания:
http://jsfiddle.net/MarkSchultheiss/JH7LR/3/
Ответ 3
loc=json.results.bindings;
tempar1=[];
tempar2=[];
for (i=0;i<loc.length;i++) {
for (prop in loc[i]) {
temp=loc[i][prop].value;
tempar1.push(temp);
}
tempar2.push(tempar1);
tempar1=[];
}
Где json равен объекту Json
Ответ 4
вы можете сделать что-то вроде этого
for (i=0;i<JSONObject.results.bindings.length;i++)
{newObject = JSONObject.results.bindings;
somethingelse = newObject[i].place.type;
}