#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.