Эффективный способ подсчета определенных сгруппированных значений jQuery Array

#jquery #arrays #loops #grouping

#jquery #массивы #циклы #группировка

Вопрос:

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

Например, получите количество для мужчин уровня B и сохраните его в переменной, для женщин уровня B и сохраните его в переменной, а уровень B небинарный, уровень A Мужской, уровень A женский и уровень A небинарный, и так далее через другие уровни, хранящие их в своих собственных переменных. Если лучше хранить их в массиве (а это, вероятно, так и есть), сохраняемый порядок должен быть уровня A Мужской, женский, двоичный вплоть до уровня Z Мужской, женский, двоичный.

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

Я написал кое-что в jsfiddle, используя фильтр, но я выполнил только уровень A. Будет слишком много строк кода, выполняющих уровни B, C, D и т.д. Я думаю, что это может быть намного короче и чище, используя цикл или что-то в этом роде. Кто-нибудь может помочь мне найти более эффективный метод? http://jsfiddle.net/cM94j/2 /

 var list ={"PEOPLE": [
    {  "name": "Bob",  "level": "A",  "gender": "F"},
        {  "name": "Sue",  "level": "B", "gender": "F"},
       {  "name": "Molly",  "level": "A", "gender": "M"},
       {  "name": "Joe",  "level": "B", "gender": "N"},
        {  "name": "Jack",  "level": "B",  "gender": "F"}
        ]};
  

Кроме того, в этом списке будет не более 80 человек и уровни A-H. Исходя из этих спецификаций, было бы лучше поместить эти данные в какую-нибудь электронную таблицу, например Excel. Это недостаточно большой проект для базы данных. Как я буду выводить на веб-сайт, если я пойду по этому пути? Должен ли я выводить эти данные на стороне сервера вместо использования jQuery?

Комментарии:

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

2. К сожалению, эта информация поступает не из базы данных. Для перспективы список будет содержать не более 80 человек и иметь уровни A-H.

Ответ №1:

Вот чистая реализация JS, которую вы, возможно, захотите использовать:

 var list ={"PEOPLE": [
    {  "name": "Bob",   "level": "A",  "gender": "F"},
        {  "name": "Sue", "level": "B", "gender": "F"},
       {  "name": "Molly", "level": "A", "gender": "M"},
       {  "name": "Joe",  "level": "B", "gender": "N"},
        {  "name": "Jack", "level": "B",  "gender": "F"}
        ]};
var counts = {};
var gender = {
  F : "Female",
  M : "Male",
  N : "Neutral"
};
for(var i = 0; i < list.PEOPLE.length; i  ){
  var key = list.PEOPLE[i].level   "_"   list.PEOPLE[i].gender;
  if(!counts[key]) counts[key] = 0;
  counts[key]  ;
}
//try printing out the result
for(var prop in counts){
  var subKey = prop.split('_');
  var level = subKey[0];
  var gen = subKey[1];
  $('#dir2').append("Level "   level   " "   gender[gen]   
                     ": "   counts[prop]   "<br/>");
}
  

Если вы хотите получить количество комбинаций (между уровнем и полом), просто создайте key по формату: level_gender (сокращение от gender) и передайте, counts чтобы получить количество.

ДЕМОНСТРАЦИЯ.

Комментарии:

1. Спасибо! И да, спасибо, что указали количество комбинаций. Я забыл, что мне также понадобятся итоги каждого уровня.

Ответ №2:

Группировку можно легко выполнить с помощью метода groupBy подчеркивания

 var grp=_.groupBy(list.PEOPLE, function(person){ return person.level '_' person.gender });
  

grp будет

 Object {A_F: Array[1], B_F: Array[2], A_M: Array[1], B_N: Array[1]}
  

к сожалению, у вас нет возможности контролировать порядок ключей в объекте JS.