2014-02-19 2 views
2

У меня возникают проблемы с суммированием и группировкой моего объекта в JQuery, поскольку я хотел бы группировать по странам, а затем иметь общую сумму на основе подпериодов 4,5 и 6 для значений внутри col1. Col1, col2, col3 являются динамическими, но использование этого примера.Суммировать и группировать объект JSON в JQuery

Мне нужно получить общее количество по стране, которая хранится в переменной страны, общая сумма за каждый подпериод, хранящийся в переменной столбцов, и общий счет, хранящийся в переменной средних значений.

Вот мой код в jsfiddle:

http://jsfiddle.net/8vVK7/8/

Мой объект:

var g_jsonData = 

[ 
{ 
    "Country": "Spain", 
    "Year": "2000", 
    "Subperiod": "4", 
    "col1": "75", 
    "col2": "500", 
    "col3": "200" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2001", 
    "Subperiod": "4", 
    "col1": "50", 
    "col2": "500", 
    "col3": "300" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2002", 
    "Subperiod": "4",  
    "col1": "50", 
    "col2": "200", 
    "col3": "300" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2003", 
    "Subperiod": "4",  
    "col1": "", 
    "col2": "200", 
    "col3": "300" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2005", 
    "Subperiod": "5", 
    "col1": "125", 
    "col2": "500", 
    "col3": "300" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2012", 
    "Subperiod": "6", 
    "col1": "100.75", 
    "col2": "500", 
    "col3": "200" 
}, 
{ 
    "Country": "Spain", 
    "Year": "2013", 
    "Subperiod": "6", 
    "col1": "200", 
    "col2": "500", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2000", 
    "Subperiod": "4",  
    "col1": "100", 
    "col2": "100", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2001", 
    "Subperiod": "4",  
    "col1": "100", 
    "col2": "100", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2002", 
    "Subperiod": "4",  
    "col1": "100", 
    "col2": "200", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2005", 
    "Subperiod": "5",  
    "col1": "100", 
    "col2": "200", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2012", 
    "Subperiod": "6",  
    "col1": "100", 
    "col2": "100", 
    "col3": "300" 
}, 
{ 
    "Country": "France", 
    "Year": "2013", 
    "Subperiod": "6",  
    "col1": "100", 
    "col2": "100", 
    "col3": "300" 
}]; 

Вот конечный результат, который я хотел бы получить, и это основано на подведении col1 за подпериода по стране.

countries =  
{ 
    "Spain":{ 
     "4":175, 
     "5":125, 
     "6":300.75 
    },  
    "France":{ 
     "4":300, 
     "5":100, 
     "6":200, 
    } 
} 

Всего за подпериода 4,5,6 должен показать, как:

columns = 
{ 
    "4":475, 
    "5":225, 
    "6":500.75 
} 

Я хотел бы также, чтобы получить общее количество для каждой страны, за подпериода:

averages = 
{ 
    "Spain":{ 
     "4":3, 
     "5":1, 
     "6":2 
    },  
    "France":{ 
     "4":3, 
     "5":1, 
     "6":2 
    } 
} 

Я хотел бы попытаться придерживаться моего кода как можно ближе. Спасибо, оцените помощь.

+0

Как значения в 'должны averages' быть рассчитан? – Cerbrus

+0

@Cerbrus Я буду использовать Испанию в качестве примера для подпериода 4 для col1, который имеет 75 + 50 + 50 + "". Таким образом, это общее количество 4. Однако, поскольку в Subperiod 4 Year 2003 имеет пустое значение, мы не учитываем его. Таким образом, общее количество равно 3. Имеет ли это смысл. –

+0

@Cerbrus, возможно, средние значения не являются хорошим именем переменной, так как его, вероятно, следует назвать Count. –

ответ

1

Это должно сделать трюк:

g_jsonData.reduce(function(out, curr){ 
    // Make sure the current country exists on the output object. 
    // Then add the current object's col1 to the current country's subperiod, 
    // checking to see if the current subperiod exists. Also, cast the `col1` to int `(+curr.col1)` 
    out.countries[curr.Country] = out.countries[curr.Country] || {}; 
    out.countries[curr.Country][curr.Subperiod] = (out.countries[curr.Country][curr.Subperiod] || 0) + (+curr.col1); 

    // And add it to the total, too. 
    out.columns[curr.Subperiod] = (out.columns[curr.Subperiod] || 0) + (+curr.col1); 

    // Count occurences 
    out.count[curr.Country] = out.count[curr.Country] || {}; 
    out.count[curr.Country][curr.Subperiod] = (out.count[curr.Country][curr.Subperiod] || 0) + 1; 
    return out; 
}, 
{'columns':{},'countries':{},'count':{}}); // second parameter to `reduce` is a default object, in this case: `{'columns':{},'countries':{},'count':{}}}` 

Возвращает:

{ 
    "columns": { 
     "4": 475, 
     "5": 225, 
     "6": 500.75 
    }, 
    "countries": { 
     "Spain": { 
      "4": 175, 
      "5": 125, 
      "6": 300.75 
     }, 
     "France": { 
      "4": 300, 
      "5": 100, 
      "6": 200 
     } 
    }, 
    "count": { 
     "Spain": { 
      "4": 3, 
      "5": 1, 
      "6": 2 
     }, 
     "France": { 
      "4": 3, 
      "5": 1, 
      "6": 2 
     } 
    } 
} 

Обратите внимание, это не изменениеg_jsonData, она только возвращает новый объект.
Чтобы использовать новый объект, вы должны присвоить его переменной, конечно:

var output = g_jsonData.reduce(func....); 

Вы можете сделать код немного короче (/ легче смотреть), как это:

g_jsonData.reduce(function(out, curr){ 
    var c = curr.Country, 
     s = curr.Subperiod, 
     v = +curr.col1; //value cast to int already 
    out.countries[c] = out.countries[c] || {}; 
    out.countries[c][s] = (out.countries[c][s] || 0) + v; 
    out.count[c]  = out.count[c]  || {}; 
    out.count[c][s]  = (out.count[c][s]  || 0) + 1; 
    out.columns[s]  = (out.columns[s]  || 0) + v; 
    return out; 
}, 
{'columns':{},'countries':{},'count':{}}); 

Теперь относительно легко сделать col1 переменное имя.
Заменить:

v = +curr.col1; 

С:

v = +curr['col1']; 

Или:

v = +curr[someVariable]; 
+0

Итак, @MoxieC, этот ответ работает на вас? – Cerbrus

+0

Отредактировано для изменения формата данных. Я не совсем уверен, как вы получаете цифры в своих «средних». – Cerbrus

+0

Я буду использовать Испанию в качестве примера для подпериода 4 для col1, который имеет 75 + 50 + 50 + "". Таким образом, это общее количество 4. Однако, поскольку в Subperiod 4 Year 2003 имеет пустое значение, мы не учитываем его. Таким образом, общее количество равно 3. Имеет ли это смысл. –

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