пытаясь выяснить, как переформатировать ответ JSON и переформатировать данные - PullRequest
2 голосов
/ 16 февраля 2011

Это дузи.

У меня есть следующий файл в формате .json:

"response": {
    "tickets": [
        {
            "alias": "Lower Box 122",
            "curr_price": 16.0,
            "quantity": 2,
            "seats": "17,18",
        },
        {
            "alias": "Lower Box 122",
            "curr_price": 8.0,
            "quantity": 5,
            "seats": "1,2,3,4,5",
        },
        {
            "alias": "Lower Box 122",
            "curr_price": 14.0,
            "quantity": 7,
            "seats": "6,7,8,9,10,11,12",
        },
        {
            "alias": "Lower Box 123",
            "curr_price": 16.0,
            "quantity": 2,
            "seats": "17,18",
        },
        {
            "alias": "Lower Box 123",
            "curr_price": 8.0,
            "quantity": 5,
            "seats": "1,2,3,4,5",
        },
        {
            "alias": "Lower Box 123",
            "curr_price": 14.0,
            "quantity": 7,
            "seats": "6,7,8,9,10,11,12",
        }
                ]
            }

Я пытаюсь получить этот вывод:

Lower Box 122,
quantity: 15,
seats: 1,2,3,4,5,6,7,8,9,10,11,12,17,18,
price: 8-16

Lower Box 123,
quantity: 15,
seats: 1,2,3,4,5,6,7,8,9,10,11,12,17,18,
price: 8-16

К сожалению, переформатирование исходного файла JSON невозможно. Я должен иметь дело с форматом, который это в настоящее время.

Мне не обязательно снова это делать в формате .json. Выкладывать текст на страницу будет просто отлично. Может кто-нибудь указать мне на утилиту, которая делает именно это? или сценарий, который сработает?

сложность: только JavaScript.

Я хочу поблагодарить всех, у кого был ответ - надеюсь, это пригодится другим.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2011
    <script type="text/javascript">
    $(document).ready(function () {

        var response = {"tickets":[{"alias":"Lower Box 122","curr_price":16.0,"quantity":2,"seats":"17,18",},{"alias":"Lower Box 122","curr_price":8.0,"quantity":5,"seats":"1,2,3,4,5",},{"alias":"Lower Box 122","curr_price":14.0,"quantity":7,"seats":"6,7,8,9,10,11,12",},{"alias":"Lower Box 123","curr_price":16.0,"quantity":2,"seats":"17,18",},{"alias":"Lower Box 123","curr_price":8.0,"quantity":5,"seats":"1,2,3,4,5",},{"alias":"Lower Box 123","curr_price":14.0,"quantity":7,"seats":"6,7,8,9,10,11,12",}]};

        var seats = new Array();
        var alias = "";
        var quantity;
        var min_price = 999999;
        var max_price = -1;


        $.each(response.tickets, function(key, value){


            if(value.alias != alias)
            {
                if(alias != "")
                {
                    seats = seats.sort(function(a,b){ return parseInt(a) > parseInt(b); });
                    alert(alias + "\ncurr_price: " + min_price + "-" + max_price + "\nquantity: " + quantity + "\nseats: " + seats);
                }

                alias = value.alias;
                quantity = 0;
                min_price = 999999;
                max_price = -1;
                seats = new Array();
            }

            if(value.curr_price < min_price)
            {
                min_price = value.curr_price;
            }

            if(value.curr_price > max_price)
            {
                max_price = value.curr_price;
            }

            $.each(value.seats.split(","), function(key, value){


                if($.inArray(value, seats) < 0)
                {
                    seats.push(parseInt(value));
                }
            });

            quantity += parseInt(value.quantity);
        });

        //Call again for last one
        seats = seats.sort(function(a,b){ return parseInt(a) > parseInt(b); });
        alert(alias + "\ncurr_price: " + min_price + "-" + max_price + "\nquantity: " + quantity + "\nseats: " + seats);
    });



</script>
1 голос
/ 16 февраля 2011

Если вы хотите включить Underscore.js , вы можете использовать метод reduce / lfold.Я сделал ему укол, но я подозреваю, что его можно немного убрать:

_.reduce(x.response.tickets, function(memo, obj){
    memo[obj.alias] = memo[obj.alias] || {quantity:0, seats:[]};
    memo[obj.alias].maxPrice =
        Math.max(memo[obj.alias].maxPrice || obj.curr_price, obj.curr_price);
    memo[obj.alias].minPrice =
        Math.min(memo[obj.alias].minPrice || obj.curr_price, obj.curr_price);
    memo[obj.alias].quantity += obj.quantity;
    memo[obj.alias].seats =
        memo[obj.alias].seats.concat(_.map(obj.seats.split(","), function(v){
            return parseInt(v,10);
        }));
    memo[obj.alias].seats.sort(function(a,b){return a-b;});
    return memo;
}, {})

, что оставляет вас с:

{
    "Lower Box 122": {
        "quantity": 14,
        "seats": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18],
        "maxPrice": 16,
        "minPrice": 8
    },
    "Lower Box 123": {
        "quantity": 14,
        "seats": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18],
        "maxPrice": 16,
        "minPrice": 8
    }
}

Дополнительно, если вы предпочитаете результатбыть массивом объектов, а не хешем, вы можете преобразовать его следующим образом (предполагая, что var k - результат вышеприведенного сгиба):

_.keys(k).map(function(alias){
    k[alias].alias = alias;
    return k[alias];
})
0 голосов
/ 16 февраля 2011

Требуется немного работы, чтобы объединить эти типы заявок.

(function($) {
   $(document).ready(function() {
       var responses = {};

       $.getJSON('responsefile.json', function(data) {
           $.each(data.response.tickets, function(index, cTicket) {
               var cSeats = cTicket.seats.split(/,/);

               if (responses[cTicket.alias] == undefined) {
                   responses[cTicket.alias] = { alias: cTicket.alias,
                                                price: { min: cTicket.curr_price, max: cTicket.curr_price },
                                                quantity: cTicket.quantity,
                                                seats: cSeats };
               } else {
                   var cResponse = responses[cTicket.alias];

                   $.each(cSeats, function(i, cSeatNumber) {
                       if ($.inArray(cSeatNumber, cResponse.seats) == -1) {
                           $.merge(cResponse.seats, [cSeatNumber]);
                       }
                   });

                   cResponse.seats.sort(function(a, b) {
                       return parseInt(a) - parseInt(b);
                   });

                   cResponse.quantity = responses[cTicket.alias].seats.length;
                   cResponse.price.min = (cTicket.curr_price < cResponse.price.min ? cTicket.curr_price : cResponse.price.min);
                   cResponse.price.max = (cTicket.curr_price > cResponse.price.max ? cTicket.curr_price : cResponse.price.max);

                   responses[cTicket.alias] = cResponse;
               }
           });

           var responseSet = [];
           $.each(responses, function(index, cResponse) {
               responseSet.push(cResponse);
           });
           responseSet.sort(function(rA, rB) {
               return (rA.alias < rB.alias ? -1 : (rA.alias > rB.alias ? 1 : 0));
           });

           processResponses(responseSet);
       });

   });
})(jQuery);

Поскольку вы запросили способ выписывания ответов, я немного изменил приведенный выше код для вызова функцииделать на выходе.Просто настройте эту функцию ниже, чтобы она указывала на правильное место.

(function($) {
    function processResponses(responses) {
        var responseText = '';
        var csv = "alias,quantity,seats,price\n";

        $.each(responses, function(index, cResponse) {
            responseText = responseText
                           + cResponse.alias + ",\n"
                           + "quantity: " + cResponse.quantity + ",\n"
                           + "seats: " + cResponse.seats.join(',') + ",\n"
                           + "price: " + cResponse.price.min + (cResponse.price.min == cResponse.price.max ? '' : '-' + cResponse.price.max) + "\n";
            csv = csv
                  + cResponse.alias + ","
                  + cResponse.quantity + ","
                  + cResponse.seats.join(' ') + ","
                  + cResponse.price.min + (cResponse.price.min == cResponse.price.max ? '' : '-' + cResponse.price.max) + "\n";
        });

        $('#text-output-location').text(responseText);
        $('#csv-output-location').text(csv);
    }
})(jQuery);

Обратите внимание на необходимость разделения пробелов между значениями мест на выходе CSV, так как их разделение запятыми потребует большого количества экранирования и снижения четкости.

Демонстрация: http://jsfiddle.net/p5QUb/

NB. Демонстрационная версия имеет несколько модификаций, позволяющих размещать AJAX на jsfiddle.net, что требует специальногообработка, а также небольшие изменения в выводе для добавления разрывов строк.

0 голосов
/ 16 февраля 2011

Я не уверен, как вы проанализируете этот пример выходных данных, поскольку вы разделяете поля запятыми, но одно из ваших значений содержит запятые, здесь есть неоднозначность.

Предполагая, что ваш JSON анализируется в объект с именем data, вы можете просто использовать jQuery:

jQuery.map(data.response.tickets, function(elt) {
    var fields = [];
    fields.push(elt.alias);
    fields.push("quantity:" + String(elt.quantity));
    fields.push("price:" + String(elt.curr_price));
    fields.push("seats:" + elt.seats);
    return fields.join(",\r\n");
}).join("\r\n\r\n");
0 голосов
/ 16 февраля 2011

Следующее изменится в нужном вам формате:

var obj = { /* your JSON goes here */ };

for (var i=0; i<obj.response.tickets.length; i++) {
  document.write(obj.response.tickets[i].alias + ",<br/>");
  document.write("quantity: " + obj.response.tickets[i].quantity + ",<br/>");
  document.write("seats: " + obj.response.tickets[i].seats + ",<br/>");
  document.write("price: " + obj.response.tickets[i].curr_price + "<br/><br/>");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...