Подтвердить что ты не робот

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;
        });
    });
});

Любая помощь, предложения, советы или исправления были бы оценены.

4b9b3361

Ответ 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;

}