Может кто-нибудь, пожалуйста, поможет выяснить, как я могу группировать и отображать объекты JSON? Вот мой пример: например, у меня есть файл JSON с именем "results.php":
[
{ "name": "project1", "url": "picture1-1.jpg"},
{ "name": "project1", "url": "picture1-2.jpg"},
{ "name": "project2", "url": "picture2-1.jpg"},
{ "name": "project3", "url": "picture3-1.jpg"},
{ "name": "project1", "url": "picture1-3.jpg"},
{ "name": "project4", "url": "picture4-1.jpg"},
{ "name": "project3", "url": "picture3-2.jpg"},
{ "name": "project1", "url": "picture1-4.jpg"}
]
И я хочу отображать все эти проекты в отдельных div, т.е. Проект 1 должен содержать только изображения picture1-1.jpg, picture1-2.jpg, picture1-3.jpg и picture1-4.jpg и т.д. Для каждого проекта. Я попытался использовать этот код для отображения данных JSON в цикле, и он отлично работает:
var source="results.php";
$.getJSON(source,function(json){
$.each(json, function(i,post){
if (post.name)
$(".body-wrapper").append('<div class="post"><h1>'+post.name+'</h1><p>'+post.url+'</p></div>');
});
});
Но я все еще не могу понять, как отображать данные JSON отдельно для каждого проекта в файле JSON.
Надеюсь, вы поможете мне решить эту проблему. Я был бы очень благодарен за это.
Заранее спасибо! :)
С наилучшими пожеланиями, Алекс
эта скрипка группирует их по имени. Используйте CTRL + J в chrome, чтобы увидеть консольный вывод сгруппированного JSON
$.each(array, function (i, item) { // iterate your JSON array
var foundItem = false; // track if an item exists in your new array
$.each(separateArray, function (y, newItem) { // iterate your new array
if (newItem.name == item.name) { // if there is an item with the same name
if (!(newItem.url instanceof Array)) { // check if the url is an array
newItem.url = [newItem.url]; // if not, then make it an array
}
newItem.url.push(item.url); // push the url as an array
foundItem = true; // notify that the item is found and we dont have to add it
}
});
if (!foundItem) { // if no item is found
separateArray.push(item); // push this item into our new array
}
});
Мне лично нравится использовать нокаут для привязки данных к представлению. Вот что я сделал, используя нокаут
Я помещал $.getJson
в viewModel
таким образом, когда инициализация нокаута viewModel
запрос ajax, а затем заполняет привязанный массив.
var viewModel = function () {
var self = this;
self.displayArray = ko.observableArray([]);
$.getJSON("/echo/json/",function(json){
// here obviously you put json through that groupJson function
self.displayArray(groupJson());
});
}
Таким образом, вам не нужно пытаться самостоятельно создавать html-экран и предсказывать, как он будет выглядеть, когда страница полностью отображается. Нокаут будет создавать элементы HTML, где это необходимо (если вы использовали, например, foreach).
Таким образом, вы все еще можете увидеть дизайн своей страницы в HTML и как она будет соответствовать всем остальным.
Это можно решить множеством способов, но я бы принял это по-другому:
$.getJSON('http://yourdomain.com/results.php', function(data){
$.each(data, function(index, element){
if(!$('div.' + element.name)[0]) {
$('.container').append('<div class="box '+element.name+'"></div>');
$('div.' + element.name).append('<h1>'+element.name+'</h1>');
}
$('div.' + element.name).append('<p>'+element.url+'</p>');
});
});