2012-10-23 2 views
3

У меня есть данные JSON, возвращаемые из вызова REST, которые я хочу проанализировать, добавить итоги, а затем выплюнуть массивы с новыми данными. У меня есть синтаксический анализ, цикл и добавление вычислений, и вы можете написать результаты на странице (см. Сообщение: json sibling data), но я хочу продолжить разбивку итогов. Вот JSON я начинаю с:новый массив javascript из возвращаемого JSON

 
{"ResultSet":{ 

    "Result":[ 

    { 
     "file_size":"722694", 
     "desc":"description1", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"19754932", 
     "desc":"description1", 
     "format":"JPEG" 
    }, 

    { 
     "file_size":"778174", 
     "desc":"description2", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"244569996", 
     "desc":"description1", 
     "format":"PNG" 
    }, 

    { 
     "file_size":"466918", 
     "desc":"description2", 
     "format":"TIFF" 
    } 

    ] 

}} 

Я получил его возвращение суммы по каждому отдельному «DESC» (см ответа: https://stackoverflow.com/a/13016615/1766026), но теперь я хочу, чтобы разбить его на один шаг дальше и показывают итоги для каждого "DESC" с каждым "формат", так что новый результат будет выглядеть следующим образом:

dESCRIPTION1: 444MB (222MB TIFF, 111MB GIF, 111MB JPEG)

dESCRIPTION2: 333MB (111MB PNG, 111 МБ TIFF, 111 МБ JPEG)

где не все возвращенные элементы имеют одинаковые форматы файлов.

(да, я знаю, что эти цифры не складываются из JSON - это просто пример)

Я думаю, это можно сделать, нажав на результаты в новый массив (ы) на основе на совпадающие элементы, затем повторяя это и выплевывая страницу.

Возможно, новый массив (ы)/объект (ы) будет выглядеть следующим образом?

 
{ 
    "desc":"description1", 
    "TIFF":"222", 
    "GIF:"111", 
    "JPEG:"111" 
}, 
{ 
    "desc":"description2", 
    "PNG":"111", 
    "TIFF:"111", 
    "JPEG":"111" 
} 

Я только что видел это: How do I create JavaScript array (JSON format) dynamically? Я думаю, это было бы одно место, чтобы начать?

(простите пожалуйста возможную неправильную терминологию - я в основном фронтальную работу и такого рода вещи довольно ново для меня - вежливая конструктивной критики с радостью приняла)

+0

Я бы отметил, что в то время как ваш пример относительно тривиально, вы обращаетесь к обработке на клиенте, а не к серверу. Для этого могут быть веские причины, но если возможно вернуть серверу данные совокупности, это может сэкономить вам боль в долгосрочной перспективе. Это тот тип, на который рассчитан SQL, и, хотя он может быть выполнен на других языках, вы часто получаете большие сложные библиотеки для всех сценариев агрегации, если хотите, чтобы они были гибкими. – Basic

+0

Это для веб-приложения, которое использует свой собственный REST API для вывода такой информации. Мы делаем большую часть отображения страницы, используя javascript/AJAX/JSON. Вся эта информация доступна через REST, поэтому мы можем использовать это, когда это возможно.Если это заканчивается слишком медленно, мы можем хорошо погрузиться в код на стороне сервера, чтобы выплюнуть некоторый HTML. Спасибо за ваш вклад. – mflorida

+0

Я полностью понимаю - и очень люблю себя. Мои ребята из UI часто заканчивают тем, что просят «/ StatsBy/DocType», «/ StatsBy/Author» и т. Д. Именно по этой причине. В любом случае, добро пожаловать в SO. Надеюсь увидеть вас около – Basic

ответ

1

Да. Итерируйте массив и постройте из него свои объекты.

var arr = parsedObj.ResultSet.Result; 

var byDesc = {}; // an object as a key-value-map 
for (var i=0; i<arr.length; i++) { 
    var desc = arr[i].desc, 
     format = arr[i].format; 
    if (! (desc in byDesc)) 
     byDesc[desc] = {}; 
    if (! (format in byDesc[desc])) 
     byDesc[desc][format] = 0; 
    byDesc[desc][format] += (+arr[i].file_size); // parseInt 
} 

теперь у нас есть объект с filesizes по формату и описанию:

{"description1":{"GIF":722694,"JPEG":19754932,"PNG":244569996},"description2":{"GIF":778174,"TIFF":466918}} 

, чтобы получить желаемый результат, мы просто перечислим этот объект:

var output = []; 
for (var desc in byDesc) { 
    var total = 0, 
     formats = []; 
    for (var format in byDesc[desc]) { 
     formats.push(Math.round(byDesc[desc][format]/1000)+"MB "+format); 
     total += byDesc[desc][format]; 
    } 
    output.push(desc+": "+Math.round(total/1000)+"MB ("+formats.join(", ")+")"); 
} 
return output.join("\n"); 

и мы получаем

description1: 265048MB (723MB GIF, 19755MB JPEG, 244570MB PNG) 
description2: 1245MB (778MB GIF, 467MB TIFF) 
+0

У меня есть первый кусок кода. Сначала как-то, затем я настроил его для работы в существующем цикле jQuery $ .each, который выполняет некоторые другие вещи. Показывает прекрасное выполнение 'console.debug (byDesc);'. Но как мне получить доступ к верхнему уровню для вывода (** «description1» ** и т. Д.)? Я не могу получить вывод, как вы показали. Он ничего не делает как есть, и я не уверен, как использовать 'return' для вывода вывода (извините за мои сырые javascript-новички-измы, я в основном делаю переднюю работу с jQuery). Я хотел бы сделать с помощью функции '.append()' jQuery, если это возможно. Благодаря! – mflorida

+0

Вот результат, который я получаю - и только одна строка: ** undefined: 3.738 ГБ (2.082 ГБ DICOM, 51.65 МБ GIF, 1.605 ГБ NIFTI, 178 КБ) ** с использованием этого кода: '$ ('body'). Append (output.join ("\ п")); '. Как получить доступ к имени «desc» верхнего уровня? – mflorida

Смежные вопросы